2013-06-29 4 views
2

이 잘 작동 코드입니다 ...이 코드에서 몇 가지 의문 ... (포인터)

int main() 
{ 
    char c[]={'\t','\n','\0'}; 
    int i; 
    char *p,*str; 
    str=c; 
    p=&c[1]; 
    printf("%d\n%d\n",*p,*str); 
    system("pause"); 
    return 0; 
} 

내 문제를 가지고 왜 그것을 str=c;하지 str=&c; (오류를주는) 및 그것의 p=&c[1]; 이 아니라 p=c[1]?

답변

3

표현식에서 사용되는 경우 array-of-T 유형의 객체 (즉, 배열 이름)에 대한 참조는 첫 번째 요소에 대한 포인터로 감소합니다. [1] 이러한 포인터의 결과 형식은 pointer-to-T입니다.

또한 인덱스로 배열 요소에 액세스하면 역 참조가 발생합니다. 그래서 주소를 알아 내기 위해 &을 사용하는 것입니다.

는 표현에 당신은
  • c

    &c[0]
  • c[1] 총점 배열의 두 번째 위치에있는 값 게시를 마무리합니다. &c[1]은 메모리 주소, 즉 포인터입니다.

[1]이 사실 네 중요한 예외가있다 : 어레이는 sizeof, & 또는 피연산자 인 경우 - C11 사람 - _Alignof 운영자, 또는 문자열 리터럴 초기화 용이다 때 문자 배열 참조 : http://c-faq.com/aryptr/aryptrequiv.html.

+2

, dowvoters는 자신을 설명해주십시오. –

+2

배열은 포인터가 아닙니다. http://c-faq.com/aryptr/aryptr2.html –

+4

아니요, 배열 이름입니다. 포인터가 아닙니다. 'sizeof' 또는 주소 ('&') 연산자의 피연산자 나 배열을 초기화하는 데 사용되는 문자열 리터럴이 아닌 한, 포인터에 _ 변환됩니다. –

4

과제를 할 때 과제의 양면이 유형과 호환되어야합니다.

특정 시나리오에서 배열의 이름은 첫 번째 요소에 대한 포인터로 감소합니다. &c이 유형 char * (str유형 char*이다)의 명확하지 않은 배열의 주소를 제공하는 동안 그래서 c 수익률은 문자, 즉 char *의 포인터 타입 불일치는 당신에게 컴파일 오류의 형태로 진단을 제공합니다. char : c[1] 그 인덱스, 즉의 값을 제공하는 동안

&c[1] 당신에게 char *을 제공합니다. 이 경우, 유형p이 다시 char *이고 따라서 관찰 된 결과입니다.


좋은 읽기 :
How do I use arrays in C++?

+1

첫 번째 요소에 대한 포인터로 변환되는 배열의 이름 만이 아니다. ** 모든 ** 배열 표현식은 첫 번째 요소에 대한 포인터로 변환됩니다 ('sizeof','&'또는'_Alignof'의 피연산자이거나 배열을 초기화하는 문자열 리터럴 인 경우 제외). 그래서'x'가'int x [3] [4] [5]'로 선언되면'* (x [2] +1)'는 포인터이기 때문에'int'에 대한 포인터로 변환됩니다 int의 다섯 배열로. (변환 결과는'& x [2] [1] [0]'과 동일합니다.) –

+0

@EricPostpischil : True. –

관련 문제