c语言 - 指针取消引用符号 * 可以称为"many"吗?



我看到指向 C 中单个变量或数组的指针是使用相同的语法声明和打印的。所以我想*被称为many,就像正则表达式符号*一样,这意味着许多,例如 x*=xxx....

int a[3] = { 4, 5, 6 };
int b = 3;
int *p, *q; // same syntax for either single variable or array
p = a; // pointer to many int
q = &b; // pointer to an int
printf("%d %d", *p, *q); // same syntax again

那么为了便于理解,我可以同时将 p 和 q 称为pointer to many int吗?

不,这不是一个好主意。指针只能指向单个变量,尽管它通常是数组的第一个元素。p = a;是指向数组a中第一个元素的指针,并且只指向该元素。指针本身无法知道它当前指向的地址后面是否有更多有效数据。

例如,编写像void print_array(int* p)这样的函数是没有意义的,因为该函数不知道数组的大小,因为p只指向第一个元素。我们宁愿写一些类似void print_array(int* p, int size)


高级主题(如果初学者则忽略(:指向"many int"的指针宁愿是称为"数组指针"的更奇特的功能,例如int (*)[3] = &a;。您可以将其视为"指向整个数组的指针",而不仅仅是指向第一个元素。

嗯,不是真的,这些类型是不可互换的。

当用作赋值的 RHS 时(在许多其他情况下(,具有数组类型的变量衰减为指向数组第一个元素的指针类型。注意

所以

p = a;

p = &(a[0]);

其中两边的类型均为指向整数 (int *( 的指针。


注意:

引用C11,章节§6.3.2.1

除非它是sizeof运算符、_Alignof运算符或 一元&运算符,或者 是用于初始化数组的字符串文本,该表达式具有 类型"类型数组"转换为类型为"指向类型的指针">的表达式,该表达式指向 到数组对象的初始元素,并且不是左值。[...]

最新更新