{
/* Prototype declaration */
void printOne(int *);
void printTwo(int *);
void printThree(int *);
/* Local definitions */
int num[5] = {3, 4, 6, 2, 1};
/* Statements */
printOne(num);
printTwo(num+2);
printThree(&num[2]);
}
void printOne(int *x)
{
printf("\n%d", x[2]);
}
void printTwo(int *x)
{
printf("\n%d", x[2]);
}
void printThree(int *x)
{
printf("\n%d", x[2]);
}
从前面的程序块打印什么?
答案分别是6,1,1,但我对printTwo和printThree有点困惑。对于printTwo,num + 2实际上是指第三个索引吗?当传入第三个索引时,x[2]
会做什么呢? printThree传入索引3的&地址?
答案 0 :(得分:1)
printTwo()
获取指向int
的指针。你正在喂它num + 2
。
num
(对待)是指向数组第一个元素的指针。数组上的指针aritmetic保证num + 2
将指向数组之后两个位置的元素,前提是数组中有足够的元素。您可以在数组范围之外的某个位置上升,并获得一致的结果,但您不会指向任何重要值。
因此,在函数内部,x
指向6.然后使用数组表示法打印*(x + 2)
,这与x[2]
实际上是相同的。这意味着您将向下移动两个位置,从而指向包含1的数组位置,然后取消引用以获取该值。
至于printThree()
,它与前一个完全相同。此外,如果数组足够大,则传递&num[2]
这意味着与num + 2
完全相同。
答案 1 :(得分:1)
所有这三个函数都以int*
为参数。这是指向int
的指针,即int
变量的地址。
在调用printOne(num)
中,参数num
是num
数组(即num[0]
的开头的地址(即指向),包含值{ {1}})。
在调用3
中,参数printTwo(num+2)
是数组中第三个元素的地址;也就是说,它指向num+2
的地址。数组元素num[2]
包含值num[2]
。
在调用6
中,参数printThree(&num[2])
是另一种表示数组中第三个元素的地址(&num[2]
)的表示法。
在三个函数的每个函数中,变量6
是传递指针的函数本地名称。变量x
可以被视为指向int的指针,也可以被视为指向int数组开头的指针。
因此,在x
中,printOne(num)
包含x
的地址,即包含值num
的内存位置的地址。
在3
和printTwo(num+2)
中,printThree(&num[2])
包含x
的地址,包含值num[2]
的内存位置。
在每个函数中,打印6
的值。在每种情况下,这是数组x[2]
的第三个元素(不一定是数组x
)。
因此在num
中,printOne(num)
的第一个元素是x
,第三个元素(打印的值)是3
。
在6
和printTwo(num+2)
中,printThree(&num[2])
的第一个元素是x
,第三个元素(打印的值)是6
。
答案 2 :(得分:0)
+
运算符处理指针,因此num+2
指向num
之后2位置的元素,指向{ {1}},然后拨打6
,这是之后的另一个2位置,即x[2]
。1
运算符适用于&
,因此它获得指向num[2]
的指针,然后它与printTwo中的类似( )。6
运营商的优先级高于[]