2012-03-16 2 views
4

아래에 3 가지 차이점이 있습니다. 나는 왜 ex1은 ex2에 대해 동일한 출력을 가지고 있고 ex3에 대한 출력이 다른지, 왜 ex2가 ex3과 다른지 이해할 수 없다.C의 기본 포인터?

EX1

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

int main(void) { 
    int x=2; 
    int *y; 
    y = &x; 
    printf("value: %d\n", *y); 
    printf("address: %d\n", y); 
    return EXIT_SUCCESS; 
} 

출력

value: 2 
address: 2686744 

EX2

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

int main(void) { 
    int x=2; 
    int *y = &x; 
    printf("value: %d\n", *y); 
    printf("address: %d\n", y); 
    return EXIT_SUCCESS; 
} 

OU

value: 2 
address: 2686744 

EX3 tput을

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

int main(void) { 
    int x=2; 
    int *y; 
    *y = &x; 
    printf("value: %d\n", *y); 
    printf("address: %d\n", y); 
    return EXIT_SUCCESS; 
} 

출력

value: 2686744 
address: 2130567168 

I은 ​​STAR가 (Y)이이되어야 생각하면 I가 포인터 BIG 오해가없는 (INT) 나는 그와 함께 시작한다. (int 모든 답

+4

참조 1- 값과 r 값은 컴파일러 경고 수준을 높이십시오, 당신은 –

+3

EX3이 유효하지 않습니다 ... 문제에 대해 이야기한다. 'y'가 설정되지 않았다면'* y'를 취할 수 없습니다. – asveikau

+1

또한 포인터를 출력 할 때'% d '가 아닌'% p'를 사용하는 습관을 가져야합니다. (그러나 여전히'* y'와 같은 정수형에는'% d'를 사용하십시오.) – asveikau

답변

5

예 3에서 y =, 당신이 먼저 선언 말한다 때문에 포인터 :

int *y; 

그리고 당신은 *yint 값이 x의 주소이라고 말한다. 때문에 당신이 int *y 선언과의

:

  • yint *
  • *y 유형 int입니다 타입이다.

그래서, 예를 들어 3 코드의 오른쪽 라인이 있어야한다 :

int *y; 
y = &x; 
+0

감사합니다. 그래서 나는 x의 y 주소를 주어야한다. 그러나 컴파일러가 y를 임의로 만드는 것이 아니라면. 내 설명이 맞습니까? – thalsharif

+0

아니요, 임의의 값이 아닙니다. '* y = & x'를 사용하면'x'의 주소의 정수 표현을 얻게됩니다. y를 인쇄 할 때 ex3에서 –

+0

. 왜 내가이 값을 얻었습니까 2130567168? 그 값이 나타내는 것은 무엇입니까? – thalsharif

1

을위한) NOT (Y) (^_^) NOW 모든 것을 나에게 분명하다 ... 덕분에 세 번째 예는 *y = 대신

+0

답변 해 주셔서 감사합니다. 귀하의 답변에 대해 – thalsharif

1
*y 

y

+0

답변 해 주셔서 감사합니다. 귀하의 답변에 대해 – thalsharif

2

흠 가리키는 ADRESS의 내용을 알고하는 데 사용됩니다, 모든 것을 가지고 있습니다 한 줄에 :

int *y 
ex1: y = &x 
ex2: y = &x 
ex3: (*y) = &x 

Ex3 is 다른 두 개와는 다릅니다.

Ex3은 포인터 y가 가리키는 값에 값 (& x)을 할당합니다.

+0

주셔서 감사합니다. 그래서 "int * y = & x;"라고 쓰면 그것은 y의 평균값은 x의 주소입니다. 그 맞습니까 ? – thalsharif

+0

@thalsharif : 기본적으로 그렇습니다. 그러나 y가 'int **'유형 인 경우에만 유효하며 y는 실제로 뭔가를 가리 킵니다. (대답하지 않습니다) – datenwolf

1

int *y; *y = &x;int *y = &x;과 다릅니다. 전자의 경우 y이 가리키는 메모리 위치의 내용을 x의 주소로 설정하고 있습니다. 후자의 경우 포인터 yx의 주소로 초기화합니다. 따라서 을 *y = &x에서 제거하면 ex1 & ex2와 동일한 출력이 표시됩니다.

+0

답변에 대한 감사합니다 – thalsharif

1

ex3에서 *y = &x;y이 가리키는 메모리 블록 안에 x의 주소를 저장한다는 것을 의미합니다. y이 실제로 아무 것도 가리키고 있지 않기 때문에 이것은 문제입니다.

무엇이든간에 printf("address: %d\n", y);이 인쇄되면 유용한 정보가 아닙니다.

+0

답변 해 주셔서 감사합니다 – thalsharif

1

형식을 선언 할 때 *는 "포인터"를 의미합니다. 그 후에는 역 참조 연산자입니다. 고려하십시오 :

int x=2; 
int *y; 
y=&x; 
*y = x; 

이것은 주소, 값 값이 할당되는 한 적절합니다. 그러나 역 참조 연산자는 내용을 제공하므로 * y = x는 범위를 벗어나지 않습니다. 임시로 취급해야합니다. 따라서 * y를 함수에 전달하고 수정하면 * y를 인쇄 할 때 수정 사항이 표시되지 않습니다. y를 전달해야합니다. 즉 "참조로 전달"입니다. 즉, & * y = & x는 불안정하며 y = & x와 동일하지 않습니다. C.