*(数组+3)如何工作?

时间:2015-10-14 23:36:43

标签: c arrays

我正在为我的期中考试。这是一个示例代码

#include <stdio.h>
void doubleArray(int array[], int length) 
 {
for (int i = 0; i < length-2; i++) {
        array[i] += array[i];
 }
     length += 5;
     printf(“%d\n”, length); // Question 29
 }


int main(int argc,char *argv[]) {
     int integers[6] = { 3, 4, 5, 6, 7, 8};
     int length = 6;


printf(“%d\n”, integers[4]); // Question 28
doubleArray(integers, length);
printf(“%d\n”, *(integers + 3)); // Question 30
printf(“%d\n”, *(integers + 4)); // Question 31
printf(“%d\n”, length); // Question 32
}

问题30和31 答案是打印12(30)和7(31) 有人可以向我解释为什么和那个&#34; *(整数+ 3)&#34;装置

1 个答案:

答案 0 :(得分:2)

*是指针上的解除引用运算符。

这意味着它将“获取”存储在项目指针地址((integers + 3))之后的值。

它会将此值解释为其后的项目的解除引用类型(int,因为(integers + 3)的类型为int*

(整数+3)

integers是指向integers数组的第一个元素地址的指针。

这意味着,如果integers包含[1, 2, 3, 4, 5],那么它将指向1存储在内存中的位置。

integers + 3获取integers的地址(即1存储在内存中的位置)并添加存储3 int s所需的地址空间量(因为指针的类型为int*)。通过一个空格推进它将在内存中为您提供2的地址,将它推进两个空格将在内存中为您提供3的地址,并将其推进三个空格将为您提供{的地址{1}}在记忆中。

这如何适用于您的示例

4为您提供(integers + 3)数组中第4项的地址,因为它是第一个元素的地址加上三个元素的大小。

使用integers运算符取消引用它会为您提供第4个元素*的值(因为12的值加倍6

这同样适用于doubleArray,但*(integers + 4)未将第5个元素加倍,因此它会为您提供doubleArray

7如何运作

doubleArray表示将变量for (int i = 0; i < length-2; i++)置于0并将其前进至i

这意味着它会从length - 20的值获取所有内容的值,但是从length - 20的值执行循环体,因为{ {1}}是独占的(条件是在执行循环体之前计算的,所以当length - 3条件为<且循环终止而没有进一步执行时。

因此,对于每个元素,排除最后两个元素,i == length - 2中的元素将被添加到自身。