char *和int *之间的区别

时间:2016-02-24 22:14:56

标签: c

我很抱歉提出一个以前肯定被问过的基本问题,但我无法找到它! 为什么在C中你可以将字符串文字分配给char *,但是不能将整数文字分配给int *?

5 个答案:

答案 0 :(得分:3)

因为在翻译期间字符串文字被翻译为charchar [])的数组。 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 *,你不能给指针分配一个整数。

(现在,如果你真的想,你可以尝试将原始内存地址分配给指针,但现在也不要担心。)