有人可以解释这些指针参数问题吗?

时间:2015-10-25 03:11:27

标签: c pointers

{
    /* 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的&地址?

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)中,参数numnum数组(即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的内存位置的地址。

3printTwo(num+2)中,printThree(&num[2])包含x的地址,包含值num[2]的内存位置。

在每个函数中,打印6的值。在每种情况下,这是数组x[2]的第三个元素(不一定是数组x)。

因此在num中,printOne(num)的第一个元素是x,第三个元素(打印的值)是3

6printTwo(num+2)中,printThree(&num[2])的第一个元素是x,第三个元素(打印的值)是6

答案 2 :(得分:0)

关于问题:

  • printTwo()+运算符处理指针,因此num+2指向num之后2位置的元素,指向{ {1}},然后拨打6,这是之后的另一个2位置,即x[2]
  • printThree()1运算符适用于&,因此它获得指向num[2]的指针,然后它与printTwo中的类似( )。

代码中的技巧:

  • 指针以元素大小为单位增加/减少,
  • 6运营商的优先级高于[]