我看到指向 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
运算符或 一元&
运算符,或者 是用于初始化数组的字符串文本,该表达式具有 类型"类型数组"转换为类型为"指向类型的指针">的表达式,该表达式指向 到数组对象的初始元素,并且不是左值。[...]