2017-10-14 13 views
3

아래 코드에서 int * p = 22로 컴파일 할 때 오류가 발생하고 ptr이 값을 성공적으로 인쇄합니다.C에서 문자열을 정수 포인터가 아닌 정수 포인터로 할당 할 수있는 이유는 무엇입니까?

int main() 
{ 

/*taking a character pointer and assigning a string to it*/ 
char *ptr = "Stackoverflow" ; //correct 

/*taking a int pointer and assigning a string to it*/ 
int *p = 22 ; //incorrect 

printf("%s",ptr); // correct and print 
printf("%d",p); //incorrect and give compile time error. 

return 0; 
} 

답변

0

당신이

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); 
0

이 줄은 메모리 주소를 22로 지정합니다. 이것은 잘못되었습니다. 이 줄은 경고만으로 컴파일되지만 런타임에 코드에서 나중에 메모리 주소 22에 액세스하려고하면 프로그램이 중단됩니다.

int *p = 22 ; //incorrect 

이 당신에게 당신이 찾고있는 결과를 줄 것이다 : 또한

int *p = NULL; 
int val = 22; 
p = &val; 

printf("%d",p); //incorrect and give compile time error. 
printf("%d",*p); //you must derefence the pointer 

%s는 동안,이 문자열을 종료 널이는 char에 대한 포인터를 취 %dint*이 아니라 int입니다.

+0

만약 우리가 어떤 유효한 주소를 주면 정수 포인터는 예를 들어 int * ptr = 0xc0563321 –

+0

이된다. 그 주소가 'int'를 담도록 할당된다면 그것은 이론적으로 작동해야한다. 해당 주소가 할당되지 않으면 프로그램이 중단됩니다. 즉, 그것은 당신이해야 할 일이거나해야 할 것이 아닙니다. 그 라인을 컴파일하려고하면, "int *가 int와 다른 레벨에서 차이가 나는"컴파일러 경고 (22는 int)를 볼 수 있습니다. 그 경고는 좋은 이유로 발행됩니다! 'calloc' 또는'malloc'을 사용하거나'&'연산자를 사용해서 만 포인터에 할당해야합니다. – Nik

+0

@Vlad는 왜'char * ptr = "Stackoverflow"가 작동하는지에 대한 좋은 설명이 있습니다. – Nik

0

때문에 문자열은 실제로 char의 배열이며, 배열에 변수를 할당 할 때 배열은 배열의 첫 번째 요소에 대한 포인터로 동작합니다. 혼란 스러울 수 있습니다. 이 여기에 더 많은 :

when does a array act as a pointer in c?

반면에 정수는 정수의 배열 단지 정수가 아닙니다.