为什么可以将字符串分配给C中的字符指针,但不能将整数值分配给整数指针

Div*_*ash 5 c literals string-literals

为什么在下面的代码中 int *p = 22 会给出编译时错误,而 ptr 会成功打印该值。

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;
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 0

例如,如果您有一个字符数组

char s[] = "Stackoverflow";
Run Code Online (Sandbox Code Playgroud)

然后将表达式中使用的数组指示符转换为指向其第一个元素的指针。所以你可以写

char *ptr = s;
Run Code Online (Sandbox Code Playgroud)

指针ptr现在指向数组的第一个字符s

C 中的字符串文字也像字符数组一样表示,并像字符数组一样存储在内存中,具有静态存储持续时间。

例如,字符串文字"Stackoverflow"具有类型char[14](包括终止零)。

那么你就写

char *ptr = "Stackoverflow";
Run Code Online (Sandbox Code Playgroud)

那么这个陈述实际上是相同的,如果有的话

static char unnamed[] = "Stackoverflow";
char *ptr = unnamed;
Run Code Online (Sandbox Code Playgroud)

至于这个说法

int *p = 22 ;
Run Code Online (Sandbox Code Playgroud)

那么整数文字不会转换为指向其自身的指针。它实际上代表数字 22,仅此而已。

因此编译器会发出一条消息,因为如果您希望指针确实包含整数值 22,那么您必须使用强制转换。

表达方式

22 == 22
Run Code Online (Sandbox Code Playgroud)

总是有收获true

虽然这个表达

"Stackoverflow" == "Stackoverflow"
Run Code Online (Sandbox Code Playgroud)

不是必需的产量true,因为根据编译器选项,编译器可以将重合的字符串文字放置在不同的内存区域中。在此表达式中,比较的是指向字符串文字的第一个字符的指针。

请考虑到,如果要输出指针指向的整数对象,则需要使用取消引用。所以无论如何而不是

printf("%d",p); 
Run Code Online (Sandbox Code Playgroud)

你应该写

printf("%d", *p); 
Run Code Online (Sandbox Code Playgroud)

或者,如果您想输出存储在指针中的值,则必须使用另一个格式说明符

printf("%p", p); 
Run Code Online (Sandbox Code Playgroud)