C 有人能解释一下这些指针参数问题吗?

C 有人能解释一下这些指针参数问题吗?,c,pointers,C,Pointers,从前面的程序块打印什么 答案分别是6,1,1,但我对Print2和Print3有点困惑。对于printwo,num+2实际上是指第三个索引吗?当传入第三个索引时,x[2]对它做了什么?printThree正在输入索引3的地址(&A),内容涉及以下问题: printTwo(),+操作符作用于指针,因此num+2指向num后面2个位置的元素,该元素指向6,然后u调用x[2],即后面的另一个2位置,即1 printThree(),&操作符处理num[2],因此它得到指向6的指针,然后它与printT

从前面的程序块打印什么

答案分别是6,1,1,但我对Print2和Print3有点困惑。对于printwo,num+2实际上是指第三个索引吗?当传入第三个索引时,
x[2]
对它做了什么?printThree正在输入索引3的地址(&A)

,内容涉及以下问题:
  • printTwo()
    +
    操作符作用于指针,因此
    num+2
    指向
    num
    后面2个位置的元素,该元素指向
    6
    ,然后u调用
    x[2]
    ,即后面的另一个2位置,即
    1
  • printThree()
    &
    操作符处理
    num[2]
    ,因此它得到指向
    6
    的指针,然后它与printTwo()中的类似

代码中的技巧:
  • 以元素大小为单位的指针增加/减少
  • []
    操作员的优先级高于
    &
printwo()
获取指向
int
的指针。您正在给它喂食
num+2

num
被视为指向数组第一个元素的指针。数组上的指针算术保证
num+2
将在第一个位置之后的两个位置指向数组的元素,前提是数组中有足够的元素。您可以上升到数组边界之外的一个位置并获得一致的结果,尽管您不会指向任何重要的值

因此,在函数内部,
x
指向6。然后使用数组表示法打印
*(x+2)
,这与
x[2]
实际上是一样的。这意味着您将进一步向下移动两个位置,从而指向包含1的数组位置,然后取消引用以获取值


至于
printThree()
,它的功能与前一个完全相同。此外,如果数组足够大,则传递的是
&num[2]
,这意味着与
num+2
完全相同。

所有三个函数都以
int*
作为参数。这是指向
int
的指针,即
int
变量的地址

在调用
printOne(num)
中,参数
num
num
数组(即
num[0]
,包含值
3
)的起始地址(即指向)

在调用
printwo(num+2)
中,参数
num+2
是数组中第三个元素的地址;也就是说,它指向
num[2]
的地址。数组元素
num[2]
包含值
6

在调用
printThree(&num[2])
中,参数
&num[2]
是另一种表示法,也指数组中第三个元素的地址(
6

在这三个函数中,变量
x
是传递指针的函数本地名称。变量
x
既可以被视为指向int的指针,也可以被视为指向int数组开头的指针

因此在
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
,第三个元素(打印的值)是
1

{
    /* 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]);
}