2010-04-11 3 views
1

나는 항상 생각이 &은 P = P = & *이 코드 시도 C.에서 P * :C 포인터와 주소

:

#include <stdio.h> 
#include <stdlib.h> 

char a[] = "programming"; 
char *ap = &a[4]; 

int main(void) 
{ 

printf("%x %x %x\n", ap, &*(ap), *&(ap)); /* line 13 */ 
printf("%x %x %x\n\n", ap+1, &*(ap+1), *&(ap+1)); /* line 14 */ 
} 

첫 번째의 printf 라인 (라인 13) 나에게 주소를 제공합니다

40b0a8 40b0a8 40b0a8

예상과 동일합니다. 나는 두 번째의 printf 라인을 추가하지만, 볼랜드는 불평 :

"first.c"

: E2027 내가 얻을 기다리고 있었다 (14)

줄에서 main 함수에서 메모리 위치의 주소를 취해야합니다 40b0a9 40b0a9 40b0a9.

14 번째 줄의 * & (ap + 1) 표현이 여기에있는 것으로 보입니다. 줄 14에있는 세 포인터 표현식은 모두 같다고 생각했습니다. 내가 왜 잘못 생각하고 있니?

번째 관련된 질문 : 라인 어레이 (A)의 첫 번째 요소

char *ap = a; 

포인트. 내가 사용

char *ap = &a[4]; 

배열 a의 다섯 번째 요소를 가리 키도록.

는 표현

char *ap = &a[0]; 

마지막 표현이 이전보다 단지 더 자세한인가와 같은 표현

char *ap = a; 

인가? 당신은 단지 좌변의 주소, 객체를 참조 즉 식을 취할 수

+0

두 번째 질문에 대답하려면 : 배열 이름의 값은 해당 배열의 0 번째 요소를 가리키는 포인터이므로 &a[0]; –

+0

과 같습니다. 예, 우리는 항상 0 번째 요소를 가리 킵니다. 그러나 C에서 인덱스는 음수 일 수 있으며 C는 불평하지 않습니다. – yCalleecharan

답변

1

C 참조 연산자를 사용할 때는 임의의식이 아닌 유효한 lvalue를 가리켜 야합니다. 따라서 값 ap+1은 단순히 위치가 아닌 표현식이므로 &(ap+1)은 유효하지 않습니다.당신은 말할 수 없습니다 ap+1 = foo();

그리고 예, 여기는 & [0]와 같습니다. * (a + b)는 a [b]와 100 % 동일합니다 (이 동등성의 비정상적인 예는 Strangest language feature의 맨 위 대답 참조). 배열 구성원에 대한 포인터를 가져올 때 & array [i] 또는 array + i를 사용할 수 있습니다. 예 :이 경우

struct foo array[5]; 
struct foo *item_3 = &array[3]; 
struct foo *also_item_3 = array + 3; 

, array+i 또는 &array[i] 사용 여부는 스타일의 문제이다. &array[i]은 더 나은 선택입니다. 배열 항목을 얻는 것이 더 명확합니다. 또한, & vec [i]는 C++의 벡터와 작동하지만 vec + i는 작동하지 않습니다.

+0

고마워요. & array [i] = array + i = & array [0] + i?라고 말할 수 있습니까? – yCalleecharan

+0

예, & array [0]이 array와 동일하기 때문에 (제공된 배열은 포인터 또는 배열입니다). –

+0

재미있는 구성/관계. 감사. – yCalleecharan

6

고마워 .... ap + 1은 주소 계산입니다. 값이 있지만 임시 객체이므로 왼쪽 값이 아니며 주소를 가져올 수 없습니다.

두 번째 질문에 대한 답으로 표현식의 대부분의 상황에서 배열은 첫 번째 요소에 대한 포인터로 붕괴되므로 예, char *ap = a;char *ap = &a[0];은 동일합니다.

+0

감사합니다. 나는 lvalues ​​및 rvalues에 대해 들었습니다. 나는 그들을 연구 할 필요가있을 것이다. – yCalleecharan

0

이러한 진술 중 하나가 범인이라면 3 행으로 나누어서 컴파일러가 불평하는 곳을 볼 수 있습니다. 나는 똑같은 혐의를 가지고 있지만, 확인을 위해 방금 내가 한 것처럼 말했다.

+0

예, 확실합니다 * & (ap +1). – yCalleecharan

0

찰스가 귀하의 주요 질문에 대해 정확하다고 생각하고 두 번째 질문에 대해 정확하다고 생각합니다. char *ap = a;char *ap = &a[0];과 같습니다.

+0

감사합니다. C는 힘들지만 배우는 것은 항상 재미 있습니다. – yCalleecharan