[英]About arrays and pointers
在此示例中,主要的一个简短问题是理解指针如何与数组一起使用:
char *lineptr[MAXLENGTH]
现在我知道这与char **lineptr
相同,因为数组本身就是一个指针。
我的问题是它如何以不同的形式/取消引用的状态工作,例如:
lineptr
*lineptr
**lineptr
*lineptr[]
在这些状态的每个状态中,发生了什么,每个状态在代码中的作用/工作是什么?
任何帮助深表感谢!
现在我知道这与
char **lineptr
相同,因为数组本身就是一个指针。
不,数组与指针不同。 请参阅C常见问题解答: http : //c-faq.com/aryptr/index.html 。
lineptr
这是数组本身。 在大多数情况下,它会衰减为指向其第一个元素的指针(即&lineptr[0]
)。 因此,其类型为int *[MAXLENGTH]
或int **
。
*lineptr
这将取消对第一个元素的指针的引用,因此它是第一个元素的值(即,与lineptr[0]
相同)。 它的类型是int *
。
**lineptr
这将取消引用第一个元素(即,它与*lineptr[0]
)。 它的类型是int
。
*lineptr[]
我认为这不是有效的语法(在这种情况下)。
lineptr
是/ array /本身。
*lineptr
是数组的第一个元素,一个char *
**lineptr
是数组的第一个元素指向的字符
*lineptr[N]
是数组的第N个元素指向的char
好的,首先是第一件事。
数组不是指针。 它们仅在需要时分解为指针。 将数组视为一个指针,该指针已经有一些数据已分配/分配给它。
lineptr
:这只是返回数组。 没什么好说的。
*lineptr
:这与访问阵列的第一个位置相同。 *lineptr
= lineptr[0]
。 这只是返回一个char *
**lineptr
:这是访问数组的第一个位置,然后取消对该位置的引用。 **lineptr
= *(lineptr[0])
。 由于您的数组保存char*
这将返回char
存储在char *
在数组的插槽0。
*lineptr[i]
:这将取消引用存储在i处的char*
。 因此,将返回lineptr[i]
指向的char
。
除非它是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则类型为“ T
N元素数组”的表达式将替换为(“ 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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.