为什么在下面的代码中 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/