我很抱歉提出一个以前肯定被问过的基本问题,但我无法找到它! 为什么在C中你可以将字符串文字分配给char *,但是不能将整数文字分配给int *?
答案 0 :(得分:3)
因为在翻译期间字符串文字被翻译为char
(char []
)的数组。 C没有明确的字符串类型。
作为每个数组,它被转换为大多数用法(sizeof
,_Alignof
和地址 - 运算符&
除外),它被转换(“衰减”)到指针到它的第一个元素。由于这是char *
,因此将其分配给char *
变量或作为char *
参数传递是没有问题的。
int
/整数常量(C标准在此处不使用术语“文字”)OTOH可以转换为指针,但这不是您通常想要的。转换也是实现定义的。因此,编译器会在没有显式强制转换的情况下为此类赋值发出警告。要强调:在极少数情况下,您希望为指针(例如嵌入式系统)分配整数常量。在典型的PC程序中没有。
要获取int
变量的地址,请使用&
运算符:
int i = 5;
int *p = &i;
如果您需要类似于字符串文字的内容,请限定变量const
:
const int i = 5;
请注意,这仍然是一个整数,因此您不能向指针添加偏移量,例如p[1]
是未定义的行为。
答案 1 :(得分:1)
C中的字符串不是原始数据类型。它实际上是一个0终止的字符序列。所以char *sp = "literal";
实际上是使用指向一系列字符的指针。
另一方面,int是一个原始类型,所以当你使用一个文字int时,它是一个没有技巧的int,使它看起来像是其他东西。
答案 2 :(得分:1)
在C中,字符串是一个字符数组。当一个数组用作表达式的值时,它通常会自动转换为指向其第一个元素的指针(有一些例外,它们在这里并不重要),所以你可以将它分配给指针变量。
其他文字不会自动转换为指针,因此您无法在不进行转换的情况下将它们分配给指针(即使您进行转换,结果也不可移植)。所以你不能这样做的原因:
int *intptr = 123;
与您无法做到的原因相同:
char *charptr = 'a';
请注意char*
没什么特别之处。您可以从int*
数组中分配int
,例如
int intarray[] = {1, 2, 3};
int *intptr = intarray;
答案 3 :(得分:1)
C字符串文字是char类型的数组(由许多字符组成)。 整数是int类型的单个项目。
这就是为每个指针赋值的语法不同的原因。
将一个char或int类型的数组赋值给指针会使用相同的语法,就像将一个char或int类型的项目赋值给指针一样。
答案 4 :(得分:0)
当你说
时char *str = "Hello";
发生的事情与您说过的情况完全相同
const char tmpstr[] = {'H', 'e', 'l', 'l', 'o', '\0'};
char *str = tmpstr;
也就是说,无论何时编写像“Hello”这样的字符串常量,编译器都会自动分配一个包含字符串的静态字符数组。使用这个数组作为字符指针的初始化器是完全可以的。 (关于字符串常量是否是const char数组,实际上存在一点点差异,但现在不要担心它。)
所以如果你说
int tmpi[] = {1, 2, 3, 4, 5};
int *ip = tmpi;
也可以完美地运作。
但你无法为int *
分配一个整数,因为这没有意义:
int *ip2 = 123; /* WRONG */
在右边我们有一个整数123,在左边我们有一个int *
,你不能给指针分配一个整数。
(现在,如果你真的想,你可以尝试将原始内存地址分配给指针,但现在也不要担心。)