당신이
char s[] = "Stackoverflow";
예를
에 관해서는 문자 배열이있는 경우 다음이 첫 번째 요소에 포인터로 변환되어 표현에 사용되는 배열 지정자. 그래서 당신은
char *ptr = s;
ptr
이제 배열 s
의 첫 번째 문자를 가리키는 포인터를 쓸 수 있습니다.
C의 문자열 리터럴도 문자 배열처럼 표시되며 정적 저장 기간이있는 문자 배열처럼 메모리에 저장됩니다.
예를 들어, 문자열 리터럴 "Stackoverflow"
의 유형은 char[14]
(종료 영점 포함)입니다.
그래서 당신은 정수 문자가 아닌 경우 같은이 문
int *p = 22 ;
에 관해서는
static char unnamed[] = "Stackoverflow";
char *ptr = unnamed;
이있을 것입니다 다음
char *ptr = "Stackoverflow";
사실이 문장 쓰기 그 자체에 대한 포인터로 변환된다. 말 그대로 22 번과 그 이상을 의미합니다.
그래서 포인터에 실제로 정수 값 22가 포함되기를 원하면 캐스팅을 사용해야하므로 컴파일러에서 메시지를 표시합니다.
22 == 22
항상 true
산출 식.
컴파일러 옵션에 컴파일러에 의존하여 서로 다른 메모리 영역에 일치하는 문자열 상수를 배치 할 수 있기 때문에,이 식
"Stackoverflow" == "Stackoverflow"
필요 수율 true
아니지만. 이 표현식에서 비교되는 문자열 리터럴의 첫 번째 문자를 가리키는 포인터입니다.
포인터로 가리키는 정수 개체를 출력하려는 경우 역 참조를 사용해야 함을 고려하십시오.
이
printf("%d",p);
당신이
printf("%d", *p);
를 작성해야 또는 출력하고자하는 경우 값이 포인터에 저장된 경우 대신에 그래서 다른 형식 지정자를 사용할 필요가
printf("%p", p);
만약 우리가 어떤 유효한 주소를 주면 정수 포인터는 예를 들어 int * ptr = 0xc0563321 –
이된다. 그 주소가 'int'를 담도록 할당된다면 그것은 이론적으로 작동해야한다. 해당 주소가 할당되지 않으면 프로그램이 중단됩니다. 즉, 그것은 당신이해야 할 일이거나해야 할 것이 아닙니다. 그 라인을 컴파일하려고하면, "int *가 int와 다른 레벨에서 차이가 나는"컴파일러 경고 (22는 int)를 볼 수 있습니다. 그 경고는 좋은 이유로 발행됩니다! 'calloc' 또는'malloc'을 사용하거나'&'연산자를 사용해서 만 포인터에 할당해야합니다. – Nik
@Vlad는 왜'char * ptr = "Stackoverflow"가 작동하는지에 대한 좋은 설명이 있습니다. – Nik