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 **
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 **
이중 포인터는 포인터를 가리키는 포인터입니다.
왜 r 값이 항상 12 단위입니까? 은 p 및 q보다 작습니까?
다른 런타임이나 다른 운영 체제/컴파일러로 이동해도 그대로 유지됩니다.
세 개의 메모리 주소가 인쇄됩니다. 그것들은 스택에 할당되기 때문에 (글로벌이 아니라고 가정 할 때) 나는 다음과 같은 것을 기대할 것이다 :
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 *
를 사용하도록을 검사하는 것입니다
코드에서 p 또는 q와 비교하여 r 값에 대한 보장이 없습니다. 당신은 그것이 더 작다고 말하기 때문에, 나는 이것이 함수 내에서 자동 변수라고 추측 할 수 있습니다. 당신이보고있는 것은 컴파일러가 (아마도) 각 포인터에 4 바이트를 할당한다는 것입니다. 그리고 그 중 3 개를 할당했는데, 12 바이트로 작동합니다. 표준 요구 사항 또는 이와 비슷한. 예를 들어, 64 비트 시스템에서는 다른 숫자를 볼 가능성이 큽니다.
char **는 char에 대한 포인터에 대한 포인터입니다. 일반적인 사용은 문자열의 동적 배열을 만드는 것입니다. 당신이 함께 그 조각을 넣어 경우
typedef char *string;
string *string_array;
, 그것은 말한다 :
char x[16];
: char **string_array;
가의 라인에 의해 코드 라인을 분석하자이 같은 시작하면 쉽게 따라갈 수 있습니다 x
은 "char
의 배열 [16]"즉, 16 char
값을 저장할 수 있습니다. 그런데 코드에서 x
을 전혀 사용하지 마십시오.
int y = 42 + 256;
y
은 298
char* p = &y;
p
에 상당하는 int
입니다 char
에 대한 포인터입니다, 당신은 그것을에 int
의 주소를 할당하려는. int
에 포인터를 지정하려면 p
을 int *p
으로 지정하거나 일반 포인터를 원할 경우 void *p
으로 선언해야합니다. 당신이하고있는 일을 정말로하고 싶다면 캐스팅이 필요합니다 : char *p = (char *)&y;
. p
초기화의 결과는 p
이 y
의 가장 낮은 주소 바이트를 가리킨다는 것입니다.
int* q = p;
q
유형의 int *
이며 p
형 char *
이다. 다시 말하지만, 캐스트가 필요합니다. 캐스트를 가정하면 표준에서 마지막 두 문장에 대해 다음과 같이 말합니다.
개체 또는 불완전한 형식의 포인터가 다른 개체 나 불완전한 형식의 포인터로 변환 될 수 있습니다. 결과 포인터가 지적 유형에 대해 올바르게 정렬되지 않으면 비헤이비어가 정의되지 않습니다. 그렇지 않으면 다시 변환 할 때 결과는 원래 포인터와 동일하게 비교됩니다.
따라서 실제 효과는 마치 int *q = &y;
입니다. 따라서 q
에는 y
의 주소가 포함되어 있습니다.
char **r = &p;
r
유형 char **
이다. &p
은 int **
입니다. 다시 말하지만 적어도 캐스팅이 필요하지만 int **
을 이식 가능하게 char **
으로 변환 할 수는 없습니다. 어쨌든 char **
을 왜 사용하고 있는지 잘 모르겠습니다. 변수에 p
의 주소를 원하면 void *
을 사용하거나 char
을 실제로 사용한다고 가정하고 char *
을 사용해야합니다.
printf("%d %d %d\n", p, q, r);
당신은 %d
형식 지정자와 포인터를 인쇄하고 있습니다. %d
은 포인터가 아니라 int
입니다. %p
을 사용하고 인쇄에는 p
, q
및 r
~ 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
p
및 q
분명히 동일을, 그리고 r
는이다 개체의 주소는 p
입니다.
귀하의 의도를 정확하게 이해하지 못했다면, 귀하가하려는 일과 그 이유를 알려 주셔야합니다.
'% p' 형식을 사용하여 포인터를 출력해야합니다. http://stackoverflow.com/questions/2129128/memory-allocation-in-c/2129610#2129610 –
"이중 포인터"라는 문구는 피할 수 있습니다. 모호합니다. 포인터 대신 포인터를 사용하여 명확하게하십시오. – scobi
@scott가 변경되었습니다. – user133466