例如,考虑一下;
char* a = "coding is fun";
我已经明白这行会创建一个指针并将字符串文字放在其指针的地址上。
该解除引用操作符实际上是在那里工作还是只是语法的一部分而只是告诉编译器创建指针数据类型?
因为如果它确实作为解除引用运算符而不是=> int* a = 5;
也应该将值5放在指针a的指针对地址上。
如果没有,那么之前的代码片段有效吗?
答案 0 :(得分:0)
如果是
之类的陈述 char* a = "coding is fun";
取消引用运算符*
不用于任何解除引用。这里的*
可以被视为类型本身的一部分,表示变量是指针类型,即变量a
的类型是{{1} },即指向char *
的指针。
该语句基本上是创建一个未命名的数组,用char
填充null终止符,然后通过将未命名的数组分配给指针,使指针指向该数组的第一个元素,因为按coding is fun
,章节§6.3.2.1
除非它是
C11
运算符,sizeof
运算符或者_Alignof
运算符的操作数。 一元&
运算符,或者是用于初始化数组的字符串文字,一个包含的表达式 type ''类型''的数组被转换为类型''指向类型''指针的表达式 到数组对象的初始元素,而不是左值。 [...]
要添加,
int* a = 5;
有效语法但无效用法,因为在那里,您尝试存储 int
值{{1作为指针到5
类型的指针,它是高度平台定义的行为。
答案 1 :(得分:0)
它有效,因为语言规范说它是。
你可以从C&C的语法中获得100%的对称性和正交性,但是你会感到失望。 :)
基本上,你可以阅读
char *a = "coding is fun";
作为:
的快捷方式char a_string[] = "coding is fun";
char *a = a_string;
当然,第一行是以下的快捷方式:
char a_string[] = { 'c', 'o', 'd', 'i', 'n', 'g', ' ', 'i', 's', ' ', 'f', 'u', 'n', '\0' };
显然,名称a_string
从未真正引入,但这就是它可以在幕后工作的方式。
整数不存在这样的快捷方式,但这很好,因为不存在等同于双引号的问题(您的int *b = 5;
示例具有看似简单的5
,而字符串示例在双引号中有一堆字符。)
答案 2 :(得分:0)
字符串文字成为指向生成在进程内存的只读部分中的数组的指针。 (在C标准中没有这样的东西,但这就是事情的实际工作方式。)
所以你实际拥有的是
char * a = <the said address>.
整数值没有这样的等价物,所以不,你认为不起作用。
答案 3 :(得分:0)
int* a = 5
将变量a
设置为指向地址5
。
char* a = "coding is fun"
将变量a
设置为指向"coding is fun"
字符串的地址,根据编译器/链接器将其放置在可执行映像中的位置确定。
通常,它将驻留在只读段中,但这不是由C语言标准决定的。
答案 4 :(得分:0)
例如,考虑一下;
char* a = "coding is fun";
我已经明白这条线会创建一个指针并放入 字符串文字在其指针的地址。
你已经落后了。该行声明了一个类型为a
的变量char *
(指向char
的指针),并使用指向给定字符串文字的第一个字符的指针值对其进行初始化。文字本身代表char
的数组。它的位置由编译器选择,与a
的位置无关,当然,如果a
未初始化,a
将开始的不确定值无关。
该解除引用操作符实际上是在那里工作还是它 只是语法的一部分,只是告诉编译器创建一个 指针数据类型?
根本不是解除引用的运营商;它是a
。
因为它确实在那里作为解除引用运算符而不是 =&GT; int * a = 5;还应该将值5放在指针a的指针地址上。
int *
作为5
的替代定义无效,因为表达式int
具有类型void *
,并且对指针类型变量的赋值需要分配给的值具有兼容的指针类型,具有类型int
,或者是空指针常量。但是,许多编译器仍会接受它,通常会发出警告,因为C允许将5
转换为指针(技术上需要强制转换)。在任何情况下,结果都不是可以取消引用以获取值5
的指针,而是可以转换到*a
的指针。这是评估(int)a
和评估char
之间的区别。
如果没有,那么之前的代码片段有效吗?
字符串文字的类型数组为 n chars
,其中 n 是文字中char *
的编号,加上一个终止。在几乎所有C上下文中,当计算数组类型的(子)表达式时,结果是指向第一个数组元素的指针。在评估字符串文字的情况下,结果指针的类型是a
,它也是const
的声明类型。将给定类型的值分配给具有完全相同类型的非x.y(...)
变量可能有什么问题?