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

标签 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;
}

最佳答案

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

char s[] = "Stackoverflow";

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

char *ptr = s;

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

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

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

那么你就这样写

char *ptr = "Stackoverflow";

那么这个语句其实也是一样的如果会有

static char unnamed[] = "Stackoverflow";
char *ptr = unnamed;

至于这个说法

int *p = 22 ;

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

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

表达式

22 == 22

总是产生true

虽然这个表达式

"Stackoverflow" == "Stackoverflow"

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

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

printf("%d",p); 

你应该写

printf("%d", *p); 

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

printf("%p", p); 

关于c - 为什么可以将字符串分配给C中的字符指针,但不能将整数值分配给整数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46748996/

相关文章:

c++ - C++ 中各种数据类型的 sizeof() 解释

c - 有没有办法将文件描述符与用户定义的数据相关联?

c - 在我的 C 程序中出现 SIGSEGV 错误

javascript - 使所有函数成为严格模式文字对象?

Java从二进制文字字符串中解析int/long

c - 取消引用 int 指针与 char 指针

c - 支持 Linux 用户空间中的字节排序

c - 按值或引用将数组传递给函数是否相同?

objective-c - Objective-C 如何处理不可变字符串的内存

c++ - 当存在修饰符(L、u8 等)时,相邻字符串文字连接会发生什么情况?