2011-01-12 3 views
0

이 두 코드 줄의 차이점은 무엇입니까?에 대한 간단한 C 질문 *

int hi; 
int *hi; 

C 프로그래밍 언어에서?

감사합니다. Amit

+0

덕분에 ... – Amit

+2

당신에게 포인터에 대한 더 깊은 이해를 원할 수 있습니다 : http://www.eskimo.com/~scs/cclass/notes/sx10b.html – FrustratedWithFormsDesigner

답변

8
int hi; 

보유 C. 내용을 사용하고 어떤 책에있는 포인터에 적어도 장이 있어야한다 메모리에 int의 공간이 있고, hi을 참조 할 때마다 메모리 공간에 int을 직접 읽거나 쓸 수 있습니다.

int *hi; 

포인터는 판독 또는 기록하거나이다마다 hi 사용하는 메모리의 pointerint에 대한 공간을 보유한다. 너는 이 아니고 int으로 작업하는이 아니며, int에 대한 포인터 일 뿐이다. 포인터가 어딘가에서 쓸만한 것을 참조 할 수있는 어딘가에 int이 있어야한다. 예 :

int hi; 
int *phi; 
phi = &hi; // phi references the int hi 
*phi = 3; // set `hi` to 3 
+0

환상적입니다. 정확히 내가 알고 싶었던 것. 질문 하나만 더 드리면 안 될까요? 나는 포인터가 매우 광범위하게 사용되는 것을 보았다. 왜? 왜 그렇게 특별하니? 왜 어떤 사람들은 단순히 정수가 아닌 포인터를 사용하는 것을 선호합니까? – Amit

+0

죄송합니다. 정수가 아니며 int 변수를 의미합니다. – Amit

+0

한 번 더 의견을 보내주십시오. 죄송합니다. 만약 내가 이렇게하면 : int hi [4]; int * phi; phi = &hi[2];'이렇게하면 phi는 'hi'배열의 세 번째 값 (0 인덱스라고 가정)의 값을 얻습니다. 포인터없이 이것을 처리 할 수 ​​있습니까? 예 :'int hi [4]; int phi; φ = hi [2]; '. 그 같은 일을하지 않겠습니까? 그렇다면 마침내 포인터가 유용한 이유를 마침내 알 수 있습니다. – Amit

2

int hi은 변수 hi를 integer으로 선언합니다. int *hi은 변수 hi를 pointer으로 정수로 선언합니다.

1

첫 번째 변수는 정수 변수를 선언하고 두 번째 변수는 정수에 대한 포인터를 선언합니다.

포인터는 StackOverflow의 게시물의 범위를 벗어하지만 this Wikipedia article는 출발점이 될 것입니다, 당신은

0

a. int i;
b. int *address;
c. address = &i;

줄에서 정수형 변수 i이 선언됩니다. 이 작업이 완료되면 컴파일러는 크기가 sizeof(int) 인 메모리 공간 (컴퓨터에 4 바이트)을 예약합니다. 이 메모리 공간을 참조하려면 포인터를 사용해야합니다.

줄 b는 특수 속성이있는 address이라는 변수를 선언합니다. 이 변수는 int을 보유하지 않지만 유형이 int 인 변수의 주소를 저장합니다. 따라서 어떤 값 address이든이 값은 int 인 변수의 주소로 해석되어야합니다. 현재 변수 address은 어떤 변수의 메모리 주소를 보유해야하는지에 대해 아직 정의하지 않았기 때문에 어떤 메모리 주소도 보유하지 않습니다.

줄 c는 "주소가 변수 i의 메모리 주소와 같습니다"라고 읽을 수 있습니다. 이제 변수 주소는 int 변수 i의 메모리 주소를 저장합니다.이 코드는 내가 볼 디버거를 사용하여 실행됩니다

int main(){ 
    int a; 
    int &b; 
    b=&a; 
    a=10; 
    return 0; 
} 

:

a = 10 // the variable's value 
b = 0x7fffffffe2fc // this is the address at which 'a' is stored. 

이 포인터는 매우 강력하고 더 자주 당신이 그것을 이해하면 그것을 사용하기 시작합니다. 다른 사람들이 읽으라고 제안한 자료 외에도 디버거 (gdb)를 사용하고 포인터가있는 몇 가지 프로그램을 실행하고 코드에서 선언 한 모든 변수를 확인하는 것이 좋습니다. 나는 어떤 문제에 대한 시각적 인 그림을 가지고있을 때 상황을 더 잘 이해하며 포인터에 대한 이해를 빠르게 할 수 있다고 생각합니다.

0

int hi ------는 hi가 2 바이트를 할당하는 정수임을 나타냅니다. int * hi ------ *는 변수의 주소를 보유하고 변수가 정수인 포인터를 나타냅니다. 두 개 모두 different.one은 정수를 나타내고 다른 하나는 정수의 주소를 나타냅니다.

0

int hi; 정수 변수에 대해 메모리에 자리를 예약하는 동안 int * ptr; 은 다른 변수의 메모리 주소를 포함하는 포인터를 메모리에 저장합니다. 당신은 다른 방법으로 포인터를 사용할 수 있습니다.

int *ptr = hi; 
int *ptr; 
ptr = &hi; 

(가) 당신이 그것을가 가리키는 주소를 변경 ptr에의 값을 변경

하지만 드 참조하는 주소가 다른 변수의 값을 변경 한 후 값을 변경 한 경우.

*ptr = 3; 

하이의 값을 변경합니다.

1

hi 기억 특정 위치에서 정수형의 값이지만
*hi 저장 INT 어떤 유형의 변수의 어드레스.

예 :

int hi = 10; 
int *hello = &hi; 
0

첫째 - INT 안녕하세요; 여기서 "hi"라는 정수 변수를 선언합니다.

다음 - int * hi; 여기 는 "안녕하세요"정수 값을 가리킬 수 있습니다 포인터입니다

참고 : INT * 하이와 안녕하세요 * INT이 @Frustrated을 편집하기위한 구문 같은