1

我有一个数组

int ar[5] = {1,2,3,4,5};
printf("%d",(ar==&ar));

打印语句返回 true。但是,如果我这样做ar+1并且&ar+1. 这指向哪里?

另外,如果我有

char *c[] = {"GeksQuiz", "MCQ", "TEST", "QUIZ"};
char **cp[] = {c+3, c+2, c+1, c};
char ***cpp = cp;

cpp+1 指向哪里?是在cpie之后cp[4]还是指向cp[1]

4

2 回答 2

4

数组的地址对应于数组对象在内存中的位置,类型为“指向数组的指针”。该位置与数组的第一个元素的地址具有相同的值。数组的第一个元素的地址是数组名称在表达式中使用时将衰减到的地址。这就解释了为什么ar == &ar

现在, asar衰减到第一个元素ar + 1的地址, 是数组的第二个元素的地址。但是, 的值&ar具有指向数组的类型指针,因此&ar + 1实际上指向ar数组本身之后,这将是对象在其最后一个元素(或&ar[5])之后的地址。

ccp、 和cpp数组可以用图形表示如下:

                      "GeksQuiz"      "MCQ"    "TEST"       "QUIZ"
                      ^               ^        ^            ^
               c:     |               |        |            |
               +---+  |               |        |            |
     +-------->| *----+               |        |            |
     |         +---+                  |        |            |
     | +------>| *--------------------+        |            |
     | |       +---+                           |            |
     | | +---->| *-----------------------------+            |
     | | |     +---+                                        |
     | | | +-->| *------------------------------------------+
     | | | |   +---+
     | | | |
     | | | |   cp:
     | | | |   +---+
     | | | +-----* |<--+
     | | |     +---+   |
     | | +-------* |   |
     | |       +---+   |
     | +---------* |   |
     |         +---+   |
     +-----------* |   |
               +---+   |
                       |
                       |
               +---+   |
           cpp:| *-----+
               +---+

因为cpp是指针变量,cpp+1所以比那个变量的值大1。该cpp变量包含cp(其第一个元素的地址)的衰减值。Socpp+1与 相同cp+1,这将对应于&cp[1]或 的第二个元素的地址cp

于 2014-08-01T14:08:35.227 回答
2

除非它是sizeofor 一元运算符的操作数&,或者是用于在声明中初始化数组的字符串字面量,否则“N-element of T” 类型的表达式将被转换(“衰减”)为“指向T"的指针,其值将是数组第一个元素的地址。

表达式ar的类型为“5 元素数组int”;如果不是操作符的操作数&,则转换为“指针int”类型,其值为数组第一个元素的地址。

表达式&ar中,ar是一元运算&符的操作数,所以不会发生转换;在这种情况下,表达式的类型是“指向 5 元素数组的指针int”。

两者ar&ar相同(数组第一个元素的地址与整个数组的地址相同),但类型不同:

Expression     Type         Decays to
----------     ----         ---------
        ar     int [5]      int *
       &ar     int (*)[5]   n/a

ar + 1将指向下一个int值(相当于 write &ar[1])。 &ar + 1将指向下一个5 元素数组int(即,它将指向int紧跟数组最后一个元素的值)。

cpp + 1将指向下一个char **元素(相当于 writing &cp[1])。

于 2014-08-01T14:22:03.217 回答