为什么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”)。您的理解是正确的。字符串文字实际上是一个字符数组