포인터와 C + +의 참조 1 부
포인터와 참조의 컴퓨터 과학 분야에서 두 가지 중요한 개념입니다. 그들은 많은 프로그래밍 언어에서 드레스를 약간 다릅니다와 함께 나타나지만 기본적으로 치료와 동일합니다. C에서 + +와 포인터가 능력이 필수적입니다.
포인터의 데이터를 특별한 형식의 변수를 가진 이런 종류의 목표로 선포 수있습니다 (또는 안) 메모리의 다른 데이터를합니다. 포인터 타입의 변수는 메모리에 한 가지의 주소를 보유하고있다. 변수, 상수를 될 수있는이 일이 다른 사람 사이에 데이터 집합, 함수의 시작.
포인터 선언
포인터의 선언 이내 * 변수 이름 앞에 추가하여 이루어집니다. 표기법을 많이 사용하는 접착제 * 타입의 이름을 상징적으로 그 유형에 "대신"포인터 변수를 ""포인터를 선언,하지만 그들은 이에 상응하는 것이라고합니다. 예를 들면 :
/ / 포인터를 int. ptr_num1 ; int * ptr_num1; / / 아니면. ptr_num2 ; int * ptr_num2; / / 포인터를 두 번합니다. ptr_double1 ; 이중 * ptr_double1; / / 아니면. ptr_double2 ; 이중 * ptr_double2;
일단 선언, 포인터, 그리고 크기입니다 따라서 메모리에서 이루어진다. 포인터의 크기는 일반적으로 컴퓨터의 비트의 수를 동일 / 질문에 시스템이 32 비트에서 예를 들어, 4 바이트.
17 18 19 20 21 22 23 24 25 26 27 28 29 30 | pc ; 숯불 c 팀, 가능 * PC; pi ; int 전, * 파이; pd ; 더블 D 조, * 경찰; / / sizeof 연산자는 인자의 타입의 크기가있다. "Size of char: " << sizeof ( c ) << " bytes" << endl ; 법원은 "숯불의" "크기 :" ""sizeof (C) "" "바이트" ""endl; "Size of int: " << sizeof ( i ) << " bytes" << endl ; 법원은 "이 Int" "크기 :" ""sizeof는 (i) "" "" ""endl 바이트; "Size of double: " << sizeof ( d ) << " bytes" << endl ; 법원은 "더블" "크기 :" ""sizeof (d)에 "" "바이트" ""endl; endl ; 법원 ""endl; "Size of char*: " << sizeof ( pc ) << " bytes" << endl ; 법원은 "숯불 *의" "크기 :" ""sizeof (PC)를 "" "바이트" ""endl; "Size of int*: " << sizeof ( pi ) << " bytes" << endl ; 법원은 "int *의" "크기 :" ""sizeof (파이) "" "" ""endl 바이트; "Size of double*: " << sizeof ( pd ) << " bytes" << endl ; 법원은 "을" "크기 *"더블 ""sizeof (경찰) "" "" ""endl 바이트; |
포인터를 사용하여
그의 진술 후, 포인터의 내용은 모든 변수와 같은 임의의 값, 메모리의 낭비이다. 들어 우리가 그에게 뭔가 보답을해야 할 때 유용합니다. 마찬가지로 포인터가 메모리 주소를 가지고, 우리가 유효한 주소를 지정할 수있습니다.
17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | int * px, * py ; x = 13 ; y = 10 ; px = & x ; py = & y ; * px = 42 ; ( * py ) ++ ; cout << * px << endl ; cout << * py << endl ; cout << ( * px ) * ( * py ) << endl ; int 엑스, y를, int * 픽셀, y를 = 10 * 평 가운데, X = 13,, 픽셀 = & 엑스, & y를 = 평; * 픽셀 = 42; (* 평) + + 법정 ""* 픽셀 ""endl 법원 ""* 평 ""endl 법정에서 ""(* 픽셀) * (* 평) ""endl; |
연산자 & (앰퍼샌드이나 앰퍼샌드) 변수는 의미의 이름 앞에 "주소", 그의 이름은 "주소"입니다.
무슨 평등의 왼쪽이 바로 그 평등의 반대쪽에 같은 종류의 막을 수있다. 포인터를 저장하는 주소입니다. 그래서 포인터로,이 경우에는 주소를 할당하려면, 당신과 함께 주소를 얻어야합니다 & 연산자.
경우를 제외하고 그곳은 암시적 형식 변환 (예 : 숫자 형식간에)로, 뭔가를 자사의 컴파일 오류의 원인을 다른 유형의 변수를 지정할 수있습니다. 다행히도!
포인터 후 올바른 주소를 가리 키도록하고있다, 우리), 누구의 정식 명칭은 "연산자를 드를 참조입니다 연산자는 * (별표와 주소의 내용에 액세스할 수있습니다.
이 성명에서 별표를 "입력"읽기 또는 포인터의 내용을 서면으로의 컨텍스트에서 포인터를 의미합니다 "주소"또는 "콘텐츠의 내용에 의해 지적을 의미합니다." 또한 제품의 산술에 대한 기호와 혼동하지 않도록주의. , 연산자의 우선 순위가 큰 테이블을 기억하고, 방금 눈을 통과하고 잊기로했다 혼동을 피하기 위해. 여기에 당신이 그 사업자를 참조 곱하기 연산자보다 우선순위가 높습 찾을 수있습니다. 일단 당신이 그 사업자를 참조 곱셈 연산자 앞에 평가되고 기억에 남는 다.
17 18 19 20 21 22 23 24 25 26 27 28 29 30 | pa, * pb ; A와 B, C, 한 * 파, * 납 int; ; = 2; ; b = 3; a ; 암 = &; b ; 무연 = 식사와 침대; pa * * pb ; C = * 파 * 납; pa * * pb ; C = * 파 * 납; pa * * pb ; C = * 파 * 납; pa ** pb ; C = * 파 ** 혈압; * pa ) * ( * pb ) ; C = (* 펜실바니아) * (* 납); "Valor da Pegadinha: " << c << endl ; 법원 "" "값 퀴즈 :" ""C ""endl; |
그럼 언제하는지 물어 알고리즘의 증거가 언제 당신이 그 내용은 PA와 무연하여 지적 곱합니다 말할 것이다 예를 들어 지난 5 라인. 이 때문에 경찰이 데리러해야한다! 그리고 만약 당신이 정말로 이렇게까지해야되는 현실에서, 침입, 당신은 4 세대가 과거에 저장됩니다 및 5 파문의 미래, 당신의 마지막 줄에 사용하도록 선택할 수있습니다.
당신의 콘텐츠와 함께 할 수있는 일반적인 변수가 할 수있는 포인터에 의해 지적하거나 읽기 또는 쓰기 (않는다면 그것은 포인터 const 것은 분명하지만, 다른 난리칠 ...).의
주소 및 포인터
아래 코드 예제가 들어있습니다 :
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 | A와 B int; pa, * pb ; int * 암, * 납; "Antes de qualquer atribuição: \n " ) ; printf 모든 과제 ( "전에는 같습니다 : \ n"); "&a = %p \n " , & a ) ; // Endereço válido dado pelo SO. 운영 체제에 의해 주어진 printf ( "& = % p을 \ n", &) / / 유효 주소입니다. "&b = %p \n " , & b ) ; // Endereço válido dado pelo SO. 운영 체제에 의해 주어진 printf ( "식사와 침대 = % p을 \ n", & b)는 / / 유효 주소입니다. "&pa = %p \n " , & pa ) ; // Endereço válido dado pelo SO. printf ( "& 파 = % p을 \ n", & 펜실바니아); 운영 체제에 의해 주어진 / / 유효 주소입니다. "&pb = %p \n " , & pb ) ; // Endereço válido dado pelo SO. printf ( "& 무연 = % p을 \ n", & 무연); 운영 체제에 의해 주어진 / / 유효 주소입니다. " \n " ) ; printf ( "\ n"); "a = %d \n " , a ) ; // Conteúdo não inicializado (aleatório). printf ( "= % d 개 \ n"); / / 초기화되지 않은 (랜덤) 콘텐츠. "b = %d \n " , b ) ; // Conteúdo não inicializado (aleatório). printf (경우 "b = % d 개 \ n", b)는 / / 초기화되지 않은 (랜덤) 콘텐츠. "pa = %p \n " , pa ) ; // Conteúdo não inicializado (aleatório). printf ( "암 = % p을 \ n", 미국 펜실바니아) / / 초기화되지 않은 (랜덤) 콘텐츠. "pb = %p \n " , pb ) ; // Conteúdo não inicializado (aleatório). printf ( "혈압 = % p을 \ n", 무연); / / 초기화되지 않은 (랜덤) 콘텐츠. / / 제발, 다음 줄을 주석을 다시 컴파일하고 실행합니다. / / printf ( "* 파 = % d 개 \ n", * 펜실바니아) / / 뭐가있을 것입니다 (*) 무작위로? / / printf ( "* 무연 = % d 개 \ n", * 무연); / / 무엇입니까 (*) 무작위로? " \n Após as inicializações dos ponteiros: \n " ) ; 포인터의 초기화 후에 printf ( "\ n 옵션 : \ n"); a ; 암 = &; b ; 무연 = 식사와 침대; "&a = %p \n " , & a ) ; // Mesmo endereço válido dado pelo SO. 운영 체제에 의해 주어진 printf ( "& = % p을 \ n", &); / /에도 유효 주소입니다. "&b = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. 운영 체제에 의해 주어진 printf ( "식사와 침대 = % p을 \ n", & b)는 / /에도 유효 주소입니다. "&pa = %p \n " , & pa ) ; // Mesmo endereço válido dado pelo SO. printf ( "& 파 = % p을 \ n", & 펜실바니아); / / 비록 올바른 주소가 운영 체제에 의해 주어진. "&pb = %p \n " , & pb ) ; // Mesmo endereço válido dado pelo SO. printf ( "& 무연 = % p을 \ n", & 무연); / / 비록 올바른 주소가 운영 체제에 의해 주어진. " \n " ) ; printf ( "\ n"); "a = %d \n " , a ) ; // Conteúdo não inicializado (aleatório). printf ( "= % d 개 \ n"); / / 초기화되지 않은 (랜덤) 콘텐츠. "b = %d \n " , b ) ; // Conteúdo não inicializado (aleatório). printf (경우 "b = % d 개 \ n", b)는 / / 초기화되지 않은 (랜덤) 콘텐츠. "pa = %p \n " , pa ) ; // Conteúdo inicializado (&a). printf ( "암 = % p을 \ n", 미국 펜실바니아) / / 초기화 콘텐츠 (&). "pb = %p \n " , pb ) ; // Conteúdo inicializado (&b). printf ( "혈압 = % p을 \ n", 무연); / / 내용 초기화 (& b) 항. "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa (*pa == a). printf ( "* 파 = % d 개 \ n", * 펜실바니아); / / 콘텐츠 파에 의해 (* 파 == 임명). "*pb = %d \n " , * pb ) ; // Conteúdo apontado por pb (*pb == b). printf ( "* 무연 = % d 개 \ n", * 무연); / / 컨텐츠에 납에 의해 (* 무연 == b 지적했다). " \n Após as inicializações dos inteiros: \n " ) ; 정수의 초기화 후에 printf ( "\ n 옵션 : \ n"); ; = 10; ; b = 13; "&a = %p \n " , & a ) ; // Mesmo endereço válido dado pelo SO. 운영 체제에 의해 주어진 printf ( "& = % p을 \ n", &); / /에도 유효 주소입니다. "&b = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. 운영 체제에 의해 주어진 printf ( "식사와 침대 = % p을 \ n", & b)는 / /에도 유효 주소입니다. "&pa = %p \n " , & pa ) ; // Mesmo endereço válido dado pelo SO. printf ( "& 파 = % p을 \ n", & 펜실바니아); / / 비록 올바른 주소가 운영 체제에 의해 주어진. "&pb = %p \n " , & pb ) ; // Mesmo endereço válido dado pelo SO. printf ( "& 무연 = % p을 \ n", & 무연); / / 비록 올바른 주소가 운영 체제에 의해 주어진. " \n " ) ; printf ( "\ n"); "a = %d \n " , a ) ; // Conteúdo inicializado (10). printf ( "= % d 개 \ n"); / / 컨텐츠 부츠 (10). "b = %d \n " , b ) ; // Conteúdo inicializado (13). printf (경우 "b = % d 개 \ n", b)는 / / 콘텐츠 부츠 (13). "pa = %p \n " , pa ) ; // Conteúdo inicializado (&a). printf ( "암 = % p을 \ n", 미국 펜실바니아) / / 초기화 콘텐츠 (&). "pb = %p \n " , pb ) ; // Conteúdo inicializado (&b). printf ( "혈압 = % p을 \ n", 무연); / / 내용 초기화 (& b) 항. "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa (*pa == a == 10). printf ( "* 파 = % d 개 \ n", * 펜실바니아); / / 콘텐츠 파에 의해 (* 파 == == 10)으로 임명했다. "*pb = %d \n " , * pb ) ; // Conteúdo apontado por pb (*pb == b == 13). printf ( "* 무연 = % d 개 \ n", * 무연); / / 컨텐츠에 납에 의해 (* 무연 == b == 13) 고 지적했다. " \n Alterando os valores através dos ponteiros: \n " ) ; printf ( "\ n 포인터를 통해서 값을 변경 같습니다 : \ n"); 7 ; * 파 = 7; 42 ; * 납 = 42; "&a = %p \n " , & a ) ; // Mesmo endereço válido dado pelo SO. 운영 체제에 의해 주어진 printf ( "& = % p을 \ n", &); / /에도 유효 주소입니다. "&b = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. 운영 체제에 의해 주어진 printf ( "식사와 침대 = % p을 \ n", & b)는 / /에도 유효 주소입니다. "&pa = %p \n " , & pa ) ; // Mesmo endereço válido dado pelo SO. printf ( "& 파 = % p을 \ n", & 펜실바니아); / / 비록 올바른 주소가 운영 체제에 의해 주어진. "&pb = %p \n " , & pb ) ; // Mesmo endereço válido dado pelo SO. printf ( "& 무연 = % p을 \ n", & 무연); / / 비록 올바른 주소가 운영 체제에 의해 주어진. " \n " ) ; printf ( "\ n"); "a = %d \n " , a ) ; // Conteúdo inicializado (a == *pa == 7). printf ( "= % d 개 \ n"); / / 컨텐츠 시작 (== * 파 == 7). "b = %d \n " , b ) ; // Conteúdo inicializado (b == *pb == 42). printf (경우 "b = % d 개 \ n", b)는 / / 내용 초기화 (나 == * 무연 == 42). "pa = %p \n " , pa ) ; // Conteúdo inicializado (&a). printf ( "암 = % p을 \ n", 미국 펜실바니아) / / 초기화 콘텐츠 (&). "pb = %p \n " , pb ) ; // Conteúdo inicializado (&b). printf ( "혈압 = % p을 \ n", 무연); / / 내용 초기화 (& b) 항. "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa ( 7). printf ( "* 파 = % d 개 \ n", * 펜실바니아); / / 컨텐츠 파 (7)에 의해 임명했다. "*pb = %d \n " , * pb ) ; // Conteúdo apontado por pb (42). printf ( "* 무연 = % d 개 \ n", * 무연); / / 컨텐츠 납 (42)에 의해 지적했다. |
라인 18와 19가 respectivamnete 두 두 포인터를 정수로 선언했다.
26 라인을 통해 23 일 제 변수의 주소를 보여줍니다. 이러한 주소는 운영 체제에 의해 주어진됐다 고정되는 반면 그 변수가 존재한다. 변수는 프로그램 기간 동안,하지만 주소는 변경하지 않는 한 실행 및 다른 사이에서 변경할 수있습니다. 누가 무슨 주소가 프로그램의 시간에 운영 체제를 정의합니다. 컴파일러는 단지 최근 x 바이트 각 변수에 대한, 그리고 해석 (스타일)이 프로그램은이 공간을 줄 것이다 필요로 알고 있소.
라인 30 33 표시가 초기화되지 않았습니다 이러한 변수의 내용입니다. 이건 쓰레기, 마지막으로 가치있는 사람)의 컴퓨터 메모리에 넣고 그 장소가 지금의 내 변수에 속하는지 안 (않습니다.
그것이 36 라인을 주석 처리하는 것이 안전합니다 참고 : 37 그들의 콘텐츠에 액세스하려고하는 PA와 무연,이 초기화되지 않았습니다하여 지적했다. 이러한 시도를하는 동안, 프로그램의 경우 변수의 주소가 유효 int 무작위로 쓰레기의 그 가치를 해석하려고합니다. 컴파일러에 따라, 운영 체제와 그들의 운명을하거나하지 무해한 사용할 수있습니다. 확실한 무엇이 라인의 결과를 예측할 수 있는지의 문제를 원천입니다.
라인 41와 42 포인터에서 정수 변수의 주소로 초기화하는 A와 B. 이후 지문이 반복됩니다.
그 포인터의 주소를, 무엇을 기대 변경하지 않아도됩니다. 어떤 변경 내용입니다. 변수 PA와 무연의 주소가 나타납니다와 b는 각각. 그 손의 내용을 정확히 변수의 주소 값은 참고 : a와 b가 프로그램의 시작 부분에 운영 체제에 의해 주어진했다. 위의 지문을 확인했다. 콘텐츠 PA와 무연하여 지적 같은 콘텐츠와 b, 이는 즉, 쓰레기가 초기화되지 않았습니다. 그러나, 이전 단계와는 달리, 지금은 포인터가 유효한 주소를 A와 B의 (주소) 및 그 a와 b 이제 할당되어 변수를 가리 키 쓰레기 메모리 포인터의 내용입니다.
라인 61와 62 정수 변수 값을 10과 13를 초기화하는 지문을 다시 한번 반복했다.
이번에는 A와 B가 더 쓰레기인지 coteúdos. 값 제대로 알려져있습니다. 거기에는 아무런 변화 참고 주소 이전 단계에서만 값을 변수의 관계에있다.
이후 A와 B가 초기화되었는지 또한, 내용 PA와 무연하여 지적 또한 자동으로 변경했다. 이 일이 있기 때문에 정확하게 메모리 변수를 PA와 무연에 의해 사용되는 동일한 분야에 PA와 무연 가리 킵니다. 이 콘텐츠를 포인터에 의해 원래의 변수의 내용을 변경하여 수정할 수있는 사람에 의해 지적 지적을 의미합니다. 그리고 마지막으로, 81-97 라인을 보여주는 대화도, 즉, 변화하는 콘텐츠의 사실입니다 포인터에 의해, 그들에 의해 자동으로 지적 원래 변수의 변경 내용을 지적했다.
그것은 코드를 찾고보다 포르투갈어 구문에 대해 그런식으로 생각하면 이해하기 쉬울 것입니다.
지금은 ...
이것은 포인터와 함께 기본적인 작업을했다. 아직 함수 포인터로 볼 수 흥미로운 것들, 예를 들어,하지만 그 이상의 고급 항목으로 간주됩니다. 이는 4 게시물에 대한 계획이 시리즈는, 다음과 같은 견해를 언급하는, 차이와 포인터 그리고 참조 마침내 함수 포인터 간의 유사성을 참조하십시오.
링크
- ponteiros.zip (게시물의 모든 소스);
- 01 - declaracao.cpp
- 02 - tamanhos.cpp
- 03 - utilizando.cpp
- 04 - pegadinha.cpp
- 05 - enderecos.cpp
- cplusplus.com의 포인터
- 길티
댓글
5 답변은 "포인터와 참조는 C + + 파트 1"
답글 남겨주세요



포인터와 참조, 어떤 포인터에 대한 얘기를 시작 게시물에 대한 일련의 이러한 시도를 [...]과 함께, 오늘 토론 [...]
[...] [...] Pointeiros 및 참조
[...]이 시리즈의 첫 번째 게시물, 우리는 포인터를 약간의 얘기. 두 번째, 우리는 견해를 언급하는 얘기. 오늘 우리는 친밀한 관계에있는 (UI를!) 포인터와 사이에 집중할 것입니다 [...]
이봐, 당신은 얼마나 당신이 게시한 게시물의 코드를 만들어 내게 가르쳐 줘야겠다?
내부 상자 특히, 라인 마킹와 언어의 키워드를 강조 표시?
문제없습니다!
Wordpress 플러그인 WP이라는 - 구문, 어떤 장면 GeSHi 뒤에 사용하고있다.
일단 예약 태그 안에 코드를 넣을 수있습니다, 속성을 "언어"와 "라인"며 설치되어 있어야합니다. 언어 자체 설명 및 설명서에서 언어 목록을 가지고 시작하는 줄을 선입니다.
GeSHi도 위키에서이 기능을 추가로 이용할 수있습니다.
팁 : 전에 코드를 복사하여 붙여넣으십시오, 4의 모든 탭을 공백으로 바꿉니다. 이 코드는 스타일이 탭에 적용을 독립적으로 만들 것입니다.
포옹