포인터와 C + + 파트 1에서 참조

4 월 19, 2009 ㆍ 안으로 배치하는 +는 C / C +

포인터와 참조는 컴퓨터 과학에서 두 가지 중요한 개념입니다. 그들은 여러 프로그래밍 언어로 옷을이나 좀 색다른으로 표시되지만 치료는 기본적으로 동일합니다. 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 ; int i, * pi ; double d, * pd ; // O operador sizeof diz o tamanho do tipo do seu argumento. cout << "Size of char:    " << sizeof ( c ) << " bytes" << endl ; cout << "Size of int:     " << sizeof ( i ) << " bytes" << endl ; cout << "Size of double:  " << sizeof ( d ) << " bytes" << endl ; cout << endl ; cout << "Size of char*:   " << sizeof ( pc ) << " bytes" << endl ; cout << "Size of int*:    " << sizeof ( pi ) << " bytes" << endl ; cout << "Size of double*: " << sizeof ( pd ) << " bytes" << endl ; * PC를, int 내가 번째 문자 C가, * 파이를 두 번 d 개, * 경찰; / / sizeof 연산자는 인수의 종류의 크기가 말합니다. 법정 <<의 번째 문자 크기 ":"<<sizeof (다) << " <<endl; 법정 << "크기의 int"바이트 : "<<sizeof은 (i) <<"바이트 "<<endl; 법정 <<"이중의 사이즈 : "<<sizeof (d)에"< "바이트 < <<endl는, 법원의 <이 endl <; 법정 << "명령은 cp (크기 char *로 :"<<sizeof)) 파이 크기 int * : "<<sizeof ("바이트 << "<<endl; 법정 <<" << "바이트"<<endl가; 법정 << "sizeof <크기의 이중 *"<(시경) << "endl 바이트"<<; 

포인터를 사용하여

그의 진술 후, 포인터의 내용이 어떤 변수와 같은 임의의 값, 쓰레기 메모리입니다. 유용하게 우리가 그에게 뭔가를 줘야이됩니다. 포인터가 메모리 주소를 보유하고, 우리는 그것에게 유효한 주소를 지정해야합니다.

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
  int x를 y를;
 px, * py ; int * 픽셀, *의 평;

 ; 엑스 = 13;
 ; y를 = 10;

 x ; 픽셀 = & 엑스;
 y ; &= y를;

 42 ; * 픽셀 = 42;
 py ) ++ ; (※ 평) + +;

 * px << endl ; 법정 <<픽셀 * <<endl;
 * py << endl ; 법정 <<이 *endl <<;
 ( * px ) * ( * py ) << endl ; 법정 <<(* 픽셀) * (※ 평) <<endl; 

연산자 & (앰퍼샌드 또는 앰퍼샌드 ) 주소 주소 ","그의 이름이 있기 때문에 "전에 수단 변수 이름."

무엇이 평등의 왼쪽은 정확하게 같은 종류의보다 평등의 반대편입니다 계속 할 수 있어야한다. 포인터 상점 주소입니다. 그래서이 경우 포인터에 주소를 할당하는, 당신이 주소를받을 필요가 & 연산자.

거기에 같은 숫자 형식 간의 암시적 유형 변환 (있는 경우)를 제외하고, 뭔가 자신이 아닌 다른 유형, 컴파일 오류를 일으키는 변수를 할당합니다. 다행히도!

포인터 후 이미 주소가 유효한 포인트, 우리는 (* 연산자는이 주소에 액세스할 수 있습니다 내용을 별표 ), 누구의 정식 명칭은 연산자는 "드 참조."

참고로 별표 그 포인터 성명 "이라는 의미 포인터 타입의 내용을 서면으로"및 또는 독서 맥락에서 "이란 지적 콘텐츠"는 내용의 주소 "를"나. 또한주의 산술 제품에 대한 기호를 혼동하지 마십시오. 그 혼란을 피하기 위해 기억 의 연산자 우선순위의 테이블을 거대한 망각, 당신은 그냥 통과 눈을 위로 떨어졌고 및. 당신이 그 드 참조 연산자는 곱셈 연산자보다 우선순위가 높습 찾을 수 있습니다. 그럼 당신은 곱셈 연산자의 것입니다 기억 드하기 전에 평가할 참조 연산자가 있습니다.

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
  pa, * pb ; int, B와 C 조, *, 펜실바니아, *의 샌드위치;
 ; = 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; 

그래서 당신은 당신이 그것의 내용을 곱합니다 말할 것이다 예제의 마지막 5 개의 라인 중 하나를 만들어달라고 알고리즘의 증명 AP와 혈압에 의해 지적했다. 그것을 위해 더 이상 선택 사령탑까지! 당신은 미래에 정말로 필요합니까하면 깨고, 현실 생활에서 이것을, 지난 세대를 저장하여 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
  int, b;
 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 ( "& 파 = %의 피 \ n이", & 파) / / 유효 기간은 운영 체제에 의해 주소를 부여.
 "&pb = %p \n " , & pb ) ; // Endereço válido dado pelo SO. printf ( "& 샌드위치 = %의 피 \ n이", & 혈압); / / 유효 기간은 OS를 주소에 의해 주어진.

 " \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 개의", 나) / / 초기화되지 않은 콘텐츠를 무작위 ().
 "pa  = %p \n " , pa ) ; // Conteúdo não inicializado (aleatório). printf ( "암 = %의 피 \ 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", &) / /도 올바른 주소 OS를 부여합니다.
 "&b  = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. printf ( "식사와 침대 = % p을 \ n", & b)는 / / 비록 올바른 주소 OS를 부여합니다.
 "&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 개의", 나) / / 초기화되지 않은 콘텐츠를 무작위 ().
 "pa  = %p \n " , pa ) ; // Conteúdo inicializado (&a). printf ( "암 = %의 피 \ N 개의", 파) / / 초기화 콘텐츠 (&).
 "pb  = %p \n " , pb ) ; // Conteúdo inicializado (&b). printf ( "혈압 = % p을 \ n", 샌드위치); / / 컨텐츠 및 초기화 (나).

 "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa (*pa == a). printf ( "* 파 = % d 개 \ N 개의", * 파) / / 컨텐츠를 가리키는 AP 통신에 의해 (※ 파가 ==).
 "*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", &) / /도 올바른 주소 OS를 부여합니다.
 "&b  = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. printf ( "식사와 침대 = % p을 \ n", & b)는 / / 비록 올바른 주소 OS를 부여합니다.
 "&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 ( "암 = %의 피 \ N 개의", 파) / / 초기화 콘텐츠 (&).
 "pb  = %p \n " , pb ) ; // Conteúdo inicializado (&b). printf ( "혈압 = % p을 \ n", 샌드위치); / / 컨텐츠 및 초기화 (나).

 "*pa = %d \n " , * pa ) ; // Conteúdo apontado por pa (*pa == a == 10). printf ( "* 파 = % d 개 \ N 개의", * 파) / / 컨텐츠를 가리키는 AP 통신에 의해 (※ 파 == == 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", &) / /도 올바른 주소 OS를 부여합니다.
 "&b  = %p \n " , & b ) ; // Mesmo endereço válido dado pelo SO. printf ( "식사와 침대 = % p을 \ n", & b)는 / / 비록 올바른 주소 OS를 부여합니다.
 "&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)는 / / 콘텐츠 (초기화 b == *의 샌드위치 == 42).
 "pa  = %p \n " , pa ) ; // Conteúdo inicializado (&a). printf ( "암 = %의 피 \ N 개의", 파) / / 초기화 콘텐츠 (&).
 "pb  = %p \n " , pb ) ; // Conteúdo inicializado (&b). printf ( "혈압 = % p을 \ n", 샌드위치); / / 컨텐츠 및 초기화 (나).

 "*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 두 개의 정수와 정수로 두 포인터를 선언합니다.

라인 23-26 보여주 제 변수의 주소를. 이러한 주소는 운영 체제에 의해 주어진 이러한 변수가 존재하는 동안 고정됩니다. 변수는 프로그램 기간 동안,하지만 주소를 변경하지 않는 한 실행 및 다른 사이에서 변경할 수 있습니다. 누가 무슨 주소가 프로그램 구현의 시간에 운영 체제가 정의합니다. 컴파일러만을 엑스 바이트는 각 변수에 필요한, 아는 사람의 해석 (스타일)의 프로그램이 그 공간을 제공합니다.

라인 30-33 보여 초기화되지 않은이 변수의 내용. 이건 쓰레기, 마지막 값은 누군가가 (누군지)는 컴퓨터 메모리에 그 장소를 넣고 어느 모르겠 지금 내 변수에 속합니다.

그것이 안전한 라인에게 36에서 주석 처리되지 않으며 37 그들의 콘텐츠에 액세스하려고 참고로 AP와 혈압, 초기화되지 않았습니다 의해 지적했다. 그들은 무작위 변수가 유효한 주소를 int 쓰레기 것처럼 이러한 시도하는 동안, 프로그램은 그 가치를 해석하려고합니다. 컴파일러에 따라 운영 체제가 사용하는 그들의 운명은 해롭지 여부있을 수 있습니다. 뭐 확실한 건은 이러한 라인의 결과가 예측과 문제의 소스는 확신입니다.

라인 41과 42 포인터에서 정수 변수의 주소로 초기화하는 A와 B 그 이후이 반복 출력합니다.

변경되지 않는 포인터의 주소를 봐, 뭘 기대했다. 어떻게 그 내용을 변경합니다. 변수 파와 샌드위치는 A와 B 각각의 주소가 나타납니다. 그 손의 내용이 정확하게 변수의 주소 값을 참고하고 운영 체제에 의해 프로그램의 시작 부분에 주어진 b. 위의 지문을 확인하십시오. 콘텐츠는 AP 통신에 의해 지적하고 혈압은 동일한 콘텐츠와 B, 초기화되지 않았거나 쓰레기입니다. 그러나, 이전 단계와는 달리, 이제는 포인터가 유효한 주소 (의 주소를 가리 키 a와 b)는 그 A와 B 쓰레기 메모리 포인터 지금은 이미 할당되어 변수를 가리킨하는 내용.

라인 61과 62 정수 변수에 값을 10과 13, 다시 반복으로 초기화하고 출력합니다.

이번에는와 b는 더 이상 잡동사니하는 coteúdos. 값이 제대로 알려져 있습니다. 그것에는 변수의 이전 단계에 상대만을 값을 주소에 변화가 없습니다.

또한 A와 B가 초기화되어 후에 보자, 내용이 AP와 혈압에 의해 지적에도 자동적으로 변경되었습니다. 이런 문제가 발생하기 때문에 정확하게 파의 샌드위치와 포인트 같은 메모리 영역 변수 파와 PB에 의해 사용합니다. 이것은 콘텐츠에 대한 포인터에 의해 원래 변수의 내용을 변경하여 수정할 수있는 뾰족한 수단으로 그를 지적했다. 그리고 마지막으로, 선 81-97 보여주는 대화 것 또한 사실, 즉, 콘텐츠에 대한 포인터로 가리키는 변화하고, 자동으로 원래의 변수들이 지적한 내용을 바꿀지도 모르겠어.

그것은 코드를보고보다 포르투갈어 구절이 생각을 이해하기가 쉽습니다.

지금은 ...

이것은 포인터와 함께 기본적인 작업을했다. 예를 들어, 그러나 그것은 더 많은 고급 주제로 간주됩니다 여전히 흥미있는 일들이 함수에 대한 포인터로 볼 수 있습니다. 4 개의 게시물 예정입니다이 시리즈, 다음과 같은 언급, 유사점과 포인터와 참조 그리고 마지막으로 함수에 대한 포인터 사이의 차이점을 참조하십시오.

링크

댓글

  • 괜찮아요 난 proxximos 게시물을 계속할 수 있도록 노력하겠습니다 동일한 문서를 보여줍니다.
  • 문제 없어!

    워드 프레스가 전화가있는 플러그인을 WP - 구문 , 장면 사용 뒤에 GeSHi .

    일단는 PRE 태그에 코드를 넣을 수 있습니다, "언어"와 "줄"속성을 추가 설치했습니다. 언어는 단정하고 문서에서 언어 목록을 가지고 있고 라인이 출발선이다.

    GeSHi도 위키에서이 기능을 추가하는 데 사용하실 수 있습니다.

    팁 : 복사하기 전에, 4 개의 공백으로 모든 탭을 대체 코드를 붙여넣습니다. 이것은 코드의 스타일 탭에 적용을 독립적으로 만들 것입니다.

    포옹
  • 페르난도
    야, 어떻게 어떻게 당신이 게시 당신이 코드를 게시하게 가르쳐 주시나요?
    상자 내부 특히, 라인을 표시하고 언어의 키워드를 강조?
블로그 Disqus에 의해 제공 코멘트