C에서 포인터를 인쇄하는 중
나는 포인터가 있는 무언가를 이해하려고 노력했다. 그래서 나는 이 코드를 썼다.
#include <stdio.h>
int main(void)
{
char s[] = "asd";
char **p = &s;
printf("The value of s is: %p\n", s);
printf("The direction of s is: %p\n", &s);
printf("The value of p is: %p\n", p);
printf("The direction of p is: %p\n", &p);
printf("The direction of s[0] is: %p\n", &s[0]);
printf("The direction of s[1] is: %p\n", &s[1]);
printf("The direction of s[2] is: %p\n", &s[2]);
return 0;
}
gcc로 컴파일할 때 다음과 같은 경고를 받는다.
$ gcc main.c -o main-bin -ansi -pedantic -Wall -lm
main.c: In function ‘main’:
main.c:6: warning: initialization from incompatible pointer type
main.c:9: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘char (*)[4]’
main.c:11: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘char **’
main.c:12: warning: format ‘%p’ expects type ‘void *’, but argument 2 has type ‘char ***’
(gcc의 깃발은 내가 C89여야 하기 때문이다)
왜 호환되지 않는 포인터 유형인가?배열의 이름은 그것의 첫 번째 요소에 대한 포인터가 아닌가?so1 s가 'a'의 포인터라면&s
a임에 틀림없다.char **
아니? 왜 내가 다른 경고를 받는 거지?()로 포인터를 던져야 하나?void *
인쇄하기 위해서?
그리고 달리기를 할 때 나는 다음과 같은 것을 얻는다.
$ ./main-bin
The value of s is: 0xbfb7c860
The direction of s is: 0xbfb7c860
The value of p is: 0xbfb7c860
The direction of p is: 0xbfb7c85c
The direction of s[0] is: 0xbfb7c860
The direction of s[1] is: 0xbfb7c861
The direction of s[2] is: 0xbfb7c862
s의 가치와 그것의 방향(물론 s의 가치)이 어떻게 될 수 있는가.p
)이 같은가?
"s"는 "char*"가 아니라 "char[4]"이다.그래서 "&s"는 "char***"가 아니라 "4개의 character 배열로 가는 포인터" 입니다.당신의 컴파일러는 "&s[0]"이라고 쓴 것처럼 "&s"를 대할 수도 있는데, 그것은 대략 같은 것이지만 "char*"이다.
당신이 "char** p = &s;"라고 쓸 때, 당신은 "나는 p가 현재 "asd"를 가리키고 있는 것의 주소로 설정되기를 원한다.그러나 현재 "asd"를 가리키는 것은 아무것도 없다.단지 "asd"를 포함하는 배열일 뿐이다.
char s[] = "asd";
char *p = &s[0]; // alternately you could use the shorthand char*p = s;
char **pp = &p;
그래, 컴파일러가 보이드를 기다리고 있어 그냥 보이드로 던져버려
/* for instance... */
printf("The value of s is: %p\n", (void *) s);
printf("The direction of s is: %p\n", (void *) &s);
함수에 인수로 배열 이름을 전달하면 배열 주소를 통과한 것처럼 처리된다.그래서 &s와 s는 같은 주장이다.K&R 5.3. &s[0]은 어레이 자체의 주소를 가져오는 것과 동일한 어레이의 첫 번째 요소의 주소를 사용하기 때문에 &s와 동일함을 참조하십시오.
다른 모든 포인터의 경우, 모든 포인터는 기본적으로 메모리 위치지만 여전히 입력되며 컴파일러는 한 유형의 포인터를 다른 유형의 포인터에 할당하는 것에 대해 경고한다.
void* p;
p는 기억주소라고 하지만 나는 기억속에 무엇이 있는지 모른다.char* s;
s는 메모리 주소이며 첫 번째 바이트는 문자를 포함한다.char** ps;
ps는 메모리 주소라고 하며, 거기에 있는 4바이트(32비트 시스템의 경우)는 타입 char*의 포인터를 포함하고 있다.
cf http://www.oberon2005.ru/paper/kr_c.pdf (e-book 버전 K&R)
성격에 대한 포인터가 아니다.char*
4자 배열에 대한 포인터:char* [4]
. g++에서는 컴파일되지 않는다.
main.cpp:함수 'int main(int, char***)'에서 main.cpp:126: 오류: 초기화 시 'char(*)[4]'를 'char**'로 변환할 수 없음
게다가 리눅스 맨 페이지에는 다음과 같이 적혀 있다.
p
보이드 * 포인터 인수는 16진수(%#x 또는 %#lx인 것처럼)로 인쇄된다.그것은 무효의 포인터가 되어야 한다.
코드를 다음으로 변경 가능:
char* s = "asd";
char** p = &s;
printf("The value of s is: %p\n", s);
printf("The address of s is: %p\n", &s);
printf("The value of p is: %p\n", p);
printf("The address of p is: %p\n", &p);
printf("The address of s[0] is: %p\n", &s[0]);
printf("The address of s[1] is: %p\n", &s[1]);
printf("The address of s[2] is: %p\n", &s[2]);
결과:
s 값: 0x403f00
s의 주소는: 0x7fff2df9d588
p의 값은 다음과 같다: 0x7fff2df9d588
p의 주소는: 0x7fff2df9d580
s[0]의 주소는: 0x403f00
s[1]의 주소는 다음과 같다: 0x403f01
s[2]의 주소는 다음과 같다: 0x403f02
정적 배열의 값(즉, 주소)은 변경할 수 없다.기술적 용어로 배열의 l값은 첫 번째 요소의 주소다.그러므로s == &s
그냥 언어의 괴짜일 뿐이야.
일반적으로 불필요하게 (void*)에게 포인터를 던지는 것은 서투른 스타일로 여겨진다.그러나 여기서는 인쇄가 가변적이기 때문에 인쇄 f 인수에 (void*) 깁스가 필요하다.프로토타입은 컴파일러가 콜 사이트에서 포인터를 어떤 유형으로 변환할지 알려주지 않는다.
행 변경:
char s[] = "asd";
다음으로:
char *s = "asd";
그리고 상황은 더욱 분명해질 것이다.
사용한 항목:
char s[] = "asd";
여기서 s는 실제로 "asd" 바이트를 가리킨다.s의 주소도 이 위치를 가리킬 것이다.
사용한 경우:
char *s = "asd";
s는 실제로 바이트 "asd"에 대한 포인터가 되듯이 s와 &s의 값은 다를 것이다.
사용한 항목:
char s[] = "asd";
char **p = &s;
여기서 s는 바이트 "asd"를 가리킨다. p는 문자에 대한 포인터로, 문자의 주소로 설정되었다.다른 말로 하면 p에 너무 많은 변화가 있다는 것이다.문자 *s = "asd"를 사용한 경우 이 추가 방향을 사용할 수 있다.
참조URL: https://stackoverflow.com/questions/197757/printing-pointers-in-c
'programing' 카테고리의 다른 글
코드 분할이 있는 Vue/Webpack 웹 앱에서 Sass/스타일시트 파일을 부분적으로 로드하는 방법 (0) | 2022.05.05 |
---|---|
v-html 지시문에 지시문을 넣을 수 있는가? (0) | 2022.05.05 |
웹 API에서 Vue를 사용하여 데이터 가져오기 (0) | 2022.05.05 |
Vuex createPersistedState 부분 지속이 작동하지 않음 (0) | 2022.05.05 |
외부 키워드는 무슨 뜻인가? (0) | 2022.05.05 |