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

Why it is possible to assign string to character pointer in C but not an integer value to an integer pointer

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

int main()
{

/*taking a character pointer and assigning a string to it*/
char *ptr = "Whosebug" ; //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;
}

这一行分配的内存地址是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*.

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

char s[] = "Whosebug";

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

char *ptr = s;

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

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

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

那么你写

char *ptr = "Whosebug";

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

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

至于这个说法

int *p = 22 ;

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

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

表达式

22 == 22

总是产生 true.

虽然这个表达式

"Whosebug" == "Whosebug"

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

请注意,如果您要输出一个由指针指向的整数对象,您需要使用解引用。所以无论如何而不是

printf("%d",p); 

你应该写

printf("%d", *p); 

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

printf("%p", p); 

因为字符串实际上是一个 char 数组,并且在将数组分配给变量时,数组将表现为指向数组第一个元素的指针。这可能令人困惑。更多相关信息:

when does a array act as a pointer in c?

另一方面,整数只是一个整数,而不是整数数组。