为什么在下面的代码中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;
}
答案 0 :(得分: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的指针,其中它是以空字符结尾的字符串,而%d
采用int
而不是int*
。
答案 1 :(得分: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);
答案 2 :(得分:0)
因为字符串实际上是一个char数组,并且在为变量赋值时,数组将表现为指向数组第一个元素的指针。这可能令人困惑。更多相关信息:
when does a array act as a pointer in c?
另一方面,整数只是一个整数,而不是整数数组。