Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么int指针必须绑定到变量而不是char指针?_C - Fatal编程技术网

为什么int指针必须绑定到变量而不是char指针?

为什么int指针必须绑定到变量而不是char指针?,c,C,我不确定我是否正确地表达了这个问题,但在这里,它的意思是: char * cp = "this is a char pointer"; 基于我目前有限的理解,上面的代码似乎是可以接受的。但是,以下代码似乎不可接受: int * ip; // UPDATED *ip = 5; // UPDATED 相反,我必须说: int x; int * ip; ip = &x; x = 5; int *ip = (int[]){ 5 }; 所以,对于字符串,我可以在拼写出来后立即初始化指

我不确定我是否正确地表达了这个问题,但在这里,它的意思是:

char * cp = "this is a char pointer";
基于我目前有限的理解,上面的代码似乎是可以接受的。但是,以下代码似乎不可接受:

int * ip;  // UPDATED
*ip = 5;   // UPDATED
相反,我必须说:

int x;
int * ip;
ip = &x;
x = 5;
int *ip = (int[]){ 5 };
所以,对于字符串,我可以在拼写出来后立即初始化指针,使其指向字符串文本。我不必用任何其他变量来标识字符串文字。。。但也许这是因为指针和数组之间的密切关系,而我实际上是在用同名的隐式数组来标识它?(我试图部分回答自己的问题)

但对于整数,我不能仅仅指向内存中浮动的整数值。我必须给这个整数值一个变量名,并指向变量位置

我猜这可能与堆栈与堆存储的差异有关?有些事我还是有点软弱


如有进一步了解,将不胜感激!谢谢

字符串本质上是字符数组。数组类型(例如
char[]
)变量通常可以称为指针(
char*
,指向数组开头的指针)。这意味着字符串文字的类型为
char*
,这就是为什么您可以将该字符串分配给指针。另一方面,整数文本(如“5”)的类型为
int
,因此不能将其分配给指针。

字符串本质上是字符数组。数组类型(例如
char[]
)变量通常可以称为指针(
char*
,指向数组开头的指针)。这意味着字符串文字的类型为
char*
,这就是为什么您可以将该字符串分配给指针。另一方面,整数文本(如“5”)的类型为
int
,因此不能将其分配给指针。

字符串文本作为字符数组存储在内存中。您可以用C来标识一个数组的起始地址。但是您不能这样做

int * ip = 5;
买你能做的(编辑:)


例如。

字符串文本作为字符数组存储在内存中。您可以用C来标识一个数组的起始地址。但是您不能这样做

int * ip = 5;
买你能做的(编辑:)


例如。

简化的原因是字符串是一个“在内存中浮动”的值。编译器实际上获取字符串并将其放入可执行文件(或库)中,当您将程序加载到内存中时,该字符串有一个地址,当您使用该字符串时,实际上会得到一个指向该地址的指针


但对于整数,编译器不会自动将值放入内存中。如果您明确地告诉它(使用变量赋值,然后获取变量的地址),它可能会这样做。但在某些情况下,它可能会选择将其存储在没有地址的寄存器中。它也可以选择根本不存储它,这取决于优化选项。

简化的原因是字符串是一个“在内存中浮动”的值。编译器实际上获取字符串并将其放入可执行文件(或库)中,当您将程序加载到内存中时,该字符串有一个地址,当您使用该字符串时,实际上会得到一个指向该地址的指针


但对于整数,编译器不会自动将值放入内存中。如果您明确地告诉它(使用变量赋值,然后获取变量的地址),它可能会这样做。但在某些情况下,它可能会选择将其存储在没有地址的寄存器中。它也可能选择根本不存储它,这取决于优化选项。

任何有效的非空指针都必须指向某个对象。该对象不必是已声明的命名变量

字符串文字指定存在于程序内存中某处的匿名静态数组对象。在大多数上下文中,对字符串文本求值的结果是该数组的第一个元素的地址。如此给定

char *cp = "this is a char pointer";
cp
指向的对象是该匿名数组的初始(第0个)元素

C99引入了复合文本,因此您实际上可以编写如下内容:

int x;
int * ip;
ip = &x;
x = 5;
int *ip = (int[]){ 5 };

虽然其行为与字符串文字有点不同。特别是,如果复合文字出现在函数中,则匿名对象的生存期仅限于封闭块。您的编译器可能支持也可能不支持复合文本。

任何有效的非空指针必须指向某个对象。该对象不必是已声明的命名变量

字符串文字指定存在于程序内存中某处的匿名静态数组对象。在大多数上下文中,对字符串文本求值的结果是该数组的第一个元素的地址。如此给定

char *cp = "this is a char pointer";
cp
指向的对象是该匿名数组的初始(第0个)元素

C99引入了复合文本,因此您实际上可以编写如下内容:

int x;
int * ip;
ip = &x;
x = 5;
int *ip = (int[]){ 5 };

虽然其行为与字符串文字有点不同。特别是,如果复合文字出现在函数中,则匿名对象的生存期仅限于封闭块。您的编译器可能支持也可能不支持复合文字。

在C语言中,字符串是指向以null结尾的字符序列的指针。这就是为什么:

char * cp = "this is a char pointer";
被接受。另一方面,如果:

int * ip = 5;

被接受(如果您坚持,您可以强制),它将声明“
ip
是指向int的指针,其地址为5”)。

在C中,字符串是指向以null结尾的字符序列的指针。这就是为什么:

char * cp = "this is a char pointer";
被接受。另一方面,如果:

int * ip = 5;

被接受(如果您坚持,您可以强制),它将声明“
ip
是指向int的指针,其地址为5”)。

您的理解是正确的。字符串文字实际上是一个字符数组