关于数组和指针

时间:2011-12-29 00:04:09

标签: c arrays pointers

一个简短的问题,主要是在这个例子中理解指针如何与数组一起工作:

char *lineptr[MAXLENGTH]

现在我明白这与char **lineptr相同,因为数组本身就是一个指针。

我的问题是它如何以不同的形式/去引用的状态工作,例如:

lineptr
*lineptr
**lineptr
*lineptr[]

在每个状态中,发生了什么,每个州在代码中做什么/工作?

非常感谢任何帮助!

4 个答案:

答案 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]是数组

的第N个元素指向的char

答案 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])。