繁体   English   中英

关于数组和指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM