我正在为我的期中考试。这是一个示例代码
#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;装置
答案 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 - 2
到0
的值获取所有内容的值,但是从length - 2
到0
的值执行循环体,因为{ {1}}是独占的(条件是在执行循环体之前计算的,所以当length - 3
条件为<
且循环终止而没有进一步执行时。
因此,对于每个元素,排除最后两个元素,i == length - 2
中的元素将被添加到自身。