2014-07-09 6 views
-4
int ar[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 

statment1: int k=(int *)((int *)(ar+1)+2); 
statment2: int l=*(*(ar+1)+2); 
statement3 int *p = (int *)a +1; 

Statement1이 컴파일되지 않습니다. Statement2 및 Statement3이 컴파일됩니다. 이제 * 대신 (int *)을 입력하면 배열이 정수형임을 감안할 때 어떤 차이가 있는지 알 수 없습니다.포인터 : 주어진 컨텍스트에서 *와 (int *) 사이의 차이

+1

'*'포인터가 가리키는 것의 가치를 얻을 것입니다'(INT의 *)는'포인터를 정수로 캐스팅이다. – AntonH

+2

아마도 아무 것도 컴파일하지 않는 것이 더 낫습니다 ... – Potatoswatter

+1

실제로 포인터가 무엇인지 읽고 이해하고, 포인터 연산이 수반하는 것을 (읽기, 시도 및 학습하여) 알아냅니다. 포인터 기반에서 1 : 1 레슨을 기대하지 마십시오. –

답변

0

당신은 참조 연산자 * 및 주조 작업 (int *)에 대해 혼란스러워하고 매우 첫번째 라인은 반지에게 종을 가져야한다 :

int k = (int *)bar; 

당신은 int 변수에 주소 (int 포인터)에 영향을하려고합니다.

*을 두 번 사용하여 2 차원 배열의 값을 얻었으므로 2 번째가 좋습니다. 권리 유형이 int * p 컨테이너 그냥 "한 차원"역 참조를 주소를 얻을 수 (하고 있기 때문에 3 회도 괜찮습니다.

어쨌든이 Wikipedia 기사 abour에 모습을 가질 수 있습니다, 그것은 충분히 명확 바랍니다 . 역 참조 연산자

0

혼란 포인터 대신 배열 인덱스의 사용이 줄에 나타납니다 : 그것은 그들이 가지고있는 것이 아니다 위해서로,

statment1: int k=(int *)((int *)(ar+1)+2); 

그러나 ar[1][2] 될하고자하는 의미를 나타납니다. 평등을 창출하다 ar[1][2] 인덱스의 NT 포인터 표현, 그것은 다음과 같습니다

statment1: int k = *(*(ar + 1) + 2) // equivalent to k = ar[1][2] 
관련 문제