2010-01-25 4 views
1
char x[16]; 
int y = 42 + 256; 
char* p = &y; 
int* q = p; 
char** r = &p; 
printf("%d %d %d\n", p, q, r); 

왜 r 값이 p와 q보다 항상 12 단위 작습니까? 고맙습니다!포인터에 대한 포인터는 무엇을합니까? char **

+4

'% p' 형식을 사용하여 포인터를 출력해야합니다. http://stackoverflow.com/questions/2129128/memory-allocation-in-c/2129610#2129610 –

+1

"이중 포인터"라는 문구는 피할 수 있습니다. 모호합니다. 포인터 대신 포인터를 사용하여 명확하게하십시오. – scobi

+0

@scott가 변경되었습니다. – user133466

답변

3

이중 포인터는 포인터를 가리키는 포인터입니다.

왜 r 값이 항상 12 단위입니까? 은 p 및 q보다 작습니까?

다른 런타임이나 다른 운영 체제/컴파일러로 이동해도 그대로 유지됩니다.

6

세 개의 메모리 주소가 인쇄됩니다. 그것들은 스택에 할당되기 때문에 (글로벌이 아니라고 가정 할 때) 나는 다음과 같은 것을 기대할 것이다 :

2030 2026 2022 

32 비트 기계와 4 바이트 포인터를 가정한다.

두 배 *은 포인터에 대한 포인터입니다. 올바른 유형을 사용하면 더 명확 해집니다.

char *str = "hello world"; 

str이 경우 NULL 종료 문자 시퀀스에 대한 포인터입니다.

char **p = &str; 

은 문자 스트링을 가리키는 포인터에 대한 포인터를 의미합니다.

int y = 42 + 256; 
char* p = &y; 

정말이 있어야한다 :

int *p = &y; 

일반적인 이유는이 경우에 char *를 사용하도록을 검사하는 것입니다

나는 "올바른 유형"당신이 가지고 있기 때문에, 예를 들어 말 개별 바이트.

0

코드에서 p 또는 q와 비교하여 r 값에 대한 보장이 없습니다. 당신은 그것이 더 작다고 말하기 때문에, 나는 이것이 함수 내에서 자동 변수라고 추측 할 수 있습니다. 당신이보고있는 것은 컴파일러가 (아마도) 각 포인터에 4 바이트를 할당한다는 것입니다. 그리고 그 중 3 개를 할당했는데, 12 바이트로 작동합니다. 표준 요구 사항 또는 이와 비슷한. 예를 들어, 64 비트 시스템에서는 다른 숫자를 볼 가능성이 큽니다.

char **는 char에 대한 포인터에 대한 포인터입니다. 일반적인 사용은 문자열의 동적 배열을 만드는 것입니다. 당신이 함께 그 조각을 넣어 경우

typedef char *string; 

string *string_array; 

, 그것은 말한다 :

char x[16]; 

: char **string_array;

4

가의 라인에 의해 코드 라인을 분석하자이 같은 시작하면 쉽게 따라갈 수 있습니다 x은 "char의 배열 [16]"즉, 16 char 값을 저장할 수 있습니다. 그런데 코드에서 x을 전혀 사용하지 마십시오.

int y = 42 + 256; 

y은 298

char* p = &y; 

p에 상당하는 int입니다 char에 대한 포인터입니다, 당신은 그것을에 int의 주소를 할당하려는. int에 포인터를 지정하려면 pint *p으로 지정하거나 일반 포인터를 원할 경우 void *p으로 선언해야합니다. 당신이하고있는 일을 정말로하고 싶다면 캐스팅이 필요합니다 : char *p = (char *)&y;. p 초기화의 결과는 py의 가장 낮은 주소 바이트를 가리킨다는 것입니다.

int* q = p; 

q 유형의 int *이며 pchar *이다. 다시 말하지만, 캐스트가 필요합니다. 캐스트를 가정하면 표준에서 마지막 두 문장에 대해 다음과 같이 말합니다.

개체 또는 불완전한 형식의 포인터가 다른 개체 나 불완전한 형식의 포인터로 변환 될 수 있습니다. 결과 포인터가 지적 유형에 대해 올바르게 정렬되지 않으면 비헤이비어가 정의되지 않습니다. 그렇지 않으면 다시 변환 할 때 결과는 원래 포인터와 동일하게 비교됩니다.

따라서 실제 효과는 마치 int *q = &y;입니다. 따라서 q에는 y의 주소가 포함되어 있습니다.

char **r = &p; 

r 유형 char **이다. &pint **입니다. 다시 말하지만 적어도 캐스팅이 필요하지만 int **을 이식 가능하게 char **으로 변환 할 수는 없습니다. 어쨌든 char **을 왜 사용하고 있는지 잘 모르겠습니다. 변수에 p의 주소를 원하면 void *을 사용하거나 char을 실제로 사용한다고 가정하고 char *을 사용해야합니다.

printf("%d %d %d\n", p, q, r); 

당신은 %d 형식 지정자와 포인터를 인쇄하고 있습니다. %d은 포인터가 아니라 int입니다. %p을 사용하고 인쇄에는 p, qr ~ void *을 사용해야합니다. 내 컴퓨터에서

#include <stdio.h> 

int main(void) 
{ 
    int y = 42 + 256; 
    void *p = &y; 
    void *q = p; 
    void *r = &p; 
    printf("%p %p %p\n", p, q, r); 
    return 0; 
} 

이 인쇄 :

난 당신이하고 싶었던 것을 이해 가정, 당신의 프로그램을 재 작성

0x7fff5fbff7dc 0x7fff5fbff7dc 0x7fff5fbff7d0 

pq 분명히 동일을, 그리고 r는이다 개체의 주소는 p입니다.

귀하의 의도를 정확하게 이해하지 못했다면, 귀하가하려는 일과 그 이유를 알려 주셔야합니다.

관련 문제