2014-03-30 2 views
0

나는 포인터 문제를 이해하지 못한다. 나는 당신이 나를 도울 수 있기를 바란다. 포인터 광기, 나는 그것을 알아낼 수 없다.

int main() 
{ 
    int tab[] = {1,2,3}; 
    int *ptr; 
    ptr=tab; // this is where my doubt lies 
    cout << &ptr << "," << ptr << "," << *ptr << "," << &tab << "," << tab << "," << *tab << endl; 
    return(0); 
} 

당신이 = & 뭔가 예를 들어 PTR을 위해,하지 말아야 원하는 포인터를 가리키는 넣어 ?? 누군가 나에게 설명 할 수 있다면 감사하겠습니다.

+0

http://stackoverflow.com/questions/1641957/is-array-name-a-pointer-in-c –

답변

3

C 배열은 가능한 한 포인터로 붕괴합니다. 라인으로

ptr=tab; 

당신은

ptr=&tab; 

비슷한 동작이 발생할 수 있지만, 종류가 다른 : 첫 번째 경우에 당신은 후자에 당신이 요구하는지, int 형 포인터를 요청하고 특정의 형태를 가지는 int 배열에의 포인터.

+1

감사합니다. 의심의 여지가 없어졌습니다. – Ackerman

3

배열이 자신의 첫 번째 요소에 대한 포인터로 붕괴 할 수 덕분에, 그래서 당신은이 작업을 수행 할 경우 : RHS에서

ptr=tab; 

tab 배열 tab의 첫 번째 요소를 가리키는 int*에 붕괴. 따라서 ptr은 이제 해당 요소를 가리 킵니다.

+0

감사합니다. 의심의 여지가 없어졌습니다. – Ackerman

2

C에서 (아마도 C++에 동일하게 적용된다고 생각합니다.) 배열 이름이 사용되는 경우 대부분의 경우 (*) 첫 번째 요소에 대한 포인터로 변환됩니다.

아래 두 줄은 사실상 동일합니다. 첫 번째는 암시 적 변환이있다

ptr = tab; 
ptr = &(tab[0]); 

(*) 배열 연산자 "주소"를 sizeof 연산자 (sizeof tab)하거나 피연산자로서 사용되는 경우,이 규칙에 대한 예외는 (&tab)

+0

두 번째 인수는 암시 적 변환도합니다. 아래 첨자 연산자는 포인터 산술로 정의되기 때문입니다. 그래서'ptr = & (tab [0]);'는'ptr = & (* (tab + 0));'와 정확하게 동일하다.'tab'는이 포인터에'0'가 추가되기 전에 다시 포인터로 붕괴된다. ... 물론, 마지막 형태는 정확하게'ptr = tab + 0;'과 동일하다. 다시'ptr = tab; '과 똑같이된다. ... – cmaster

+0

고마워. 의심의 여지가 없어졌습니다. – Ackerman

관련 문제