C 有人能解释一下这些指针参数问题吗?
从前面的程序块打印什么 答案分别是6,1,1,但我对Print2和Print3有点困惑。对于printwo,num+2实际上是指第三个索引吗?当传入第三个索引时,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
x[2]
对它做了什么?printThree正在输入索引3的地址(&A),内容涉及以下问题:
- printTwo(),
操作符作用于指针,因此+
指向num+2
后面2个位置的元素,该元素指向num
,然后u调用6
,即后面的另一个2位置,即x[2]
1
- printThree(),
操作符处理&
,因此它得到指向num[2]
的指针,然后它与printTwo()中的类似6
代码中的技巧:
- 以元素大小为单位的指针增加/减少
操作员的优先级高于[]
&
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]);
}