一个简短的问题,主要是在这个例子中理解指针如何与数组一起工作:
char *lineptr[MAXLENGTH]
现在我明白这与char **lineptr
相同,因为数组本身就是一个指针。
我的问题是它如何以不同的形式/去引用的状态工作,例如:
lineptr
*lineptr
**lineptr
*lineptr[]
在每个状态中,发生了什么,每个州在代码中做什么/工作?
非常感谢任何帮助!
答案 0 :(得分:5)
现在我明白这与
char **lineptr
相同,因为数组本身就是一个指针。
不,数组与指针不同。请参阅C FAQ:http://c-faq.com/aryptr/index.html。
lineptr
这是数组本身。在大多数情况下,衰减成指向其第一个元素的指针(即&lineptr[0]
)。所以它的类型是int *[MAXLENGTH]
或int **
。
*lineptr
这取消引用指向第一个元素的指针,因此它是第一个元素的值(即它与lineptr[0]
相同)。它的类型是int *
。
**lineptr
这取消了第一个元素的引用(即它与*lineptr[0]
相同)。它的类型是int
。
*lineptr[]
我不认为这是有效的语法(在此上下文中)。
答案 1 :(得分:1)
lineptr
是/ array /本身。
*lineptr
是数组的第一个元素,一个char *
**lineptr
是数组的第一个元素指向的字符
*lineptr[N]
是数组
答案 2 :(得分:1)
好的,首先要做的事情。
数组不是指针。他们只需在需要时分解为指针。可以把数组想象成一个指针,它已经有一些数据被malloced / alloca给它。
lineptr
:这只是返回数组。没什么可说的。
*lineptr
:这与访问阵列的第一个位置相同。 *lineptr
= lineptr[0]
。这恰好会返回char *
**lineptr
:这是访问阵列的第一个位置,然后取消引用该位置。 **lineptr
= *(lineptr[0])
。由于您的数组包含char*
,因此会返回存储在数组插槽0中char
的{{1}}。
char *
:取消引用i中存储的*lineptr[i]
。因此返回char*
指向的char
。
答案 3 :(得分:1)
除非它是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则表达式为“N-element array of T
“将被替换为(”decay to“)类型为”T
指针“的表达式,表达式的值将是第一个元素的地址。
表达式lineptr
的类型为“MAXLENGTH
- 元素数组char *
”。在大多数情况下,它将替换为char **
类型的表达式。这是一个方便的表格,显示了所有可能性:
Expression Type Decays to Evaluates to ---------- ---- --------- ------------ lineptr char *[MAXLENGTH] char ** address of first element in array &lineptr char *(*)[MAXLENGTH] n/a address of array *lineptr char * n/a value of first element lineptr[i] char * n/a value of i'th element &lineptr[i] char ** n/a address of i'th element *lineptr[i] char n/a value of character pointed to by i'th element **lineptr char n/a value of character pointed to by zero'th element
请注意lineptr
和&lineptr
计算相同的值(数组的地址与其第一个元素的地址相同),但它们的类型是不同(char **
与char *(*)[MAXLENGTH]
)。