为什么将数组作为实际参数发送到需要指向数组的指针的函数需要取消引用 2 次才能访问数组?
Why sending an array as an actual parameter to function which expects a pointer to an array needs dereferencing 2 times to access the array?
#include<stdio.h>
int fun(int (*x)[3]) {
return **x*2; // Why we need to dereference two times here?
}
int main(void) {
int a[3] = {1, 2, 3};
printf("%d", fun(a)); // 2
}
所以我知道数组名称仅充当数组的地址,并且在函数中 x 也需要数组的地址所以为什么我们需要两次而不是一次取消引用 x ?
本次电话会议的初学者
printf("%d", fun(a));
表达式 a
(数组指示符)隐式转换为指向类型为 int *
.
的元素类型的指针
同时函数参数的类型为int ( * )[3]
.
没有从类型 int *
到类型 int ( * )[3]
的隐式转换。所以编译器会报错。
函数调用必须类似于
printf("%d", fun( &a ));
在取消引用指针 x
的函数中,您将得到类型为 int[3]
的 object,它是原始数组的左值。再次用于表达式(极少数例外),数组指示符被转换为指向其第一个元素的 int *
类型的指针。
因此,要访问数组的第一个元素,您需要再取消对表达式的引用
**x*2
您有以下表达式转换链
&a -> int ( *x )[3]
*x -> int[3]
int[3] -> int *
*( int * ) -> int
您实质上是将一个 int 指针数组作为参数传递给 fun
。
如果您只将 int x[3]
传递给该函数,则只需取消引用一次。
#include<stdio.h>
int fun(int (*x)[3]) {
return **x*2; // Why we need to dereference two times here?
}
int main(void) {
int a[3] = {1, 2, 3};
printf("%d", fun(a)); // 2
}
所以我知道数组名称仅充当数组的地址,并且在函数中 x 也需要数组的地址所以为什么我们需要两次而不是一次取消引用 x ?
本次电话会议的初学者
printf("%d", fun(a));
表达式 a
(数组指示符)隐式转换为指向类型为 int *
.
同时函数参数的类型为int ( * )[3]
.
没有从类型 int *
到类型 int ( * )[3]
的隐式转换。所以编译器会报错。
函数调用必须类似于
printf("%d", fun( &a ));
在取消引用指针 x
的函数中,您将得到类型为 int[3]
的 object,它是原始数组的左值。再次用于表达式(极少数例外),数组指示符被转换为指向其第一个元素的 int *
类型的指针。
因此,要访问数组的第一个元素,您需要再取消对表达式的引用
**x*2
您有以下表达式转换链
&a -> int ( *x )[3]
*x -> int[3]
int[3] -> int *
*( int * ) -> int
您实质上是将一个 int 指针数组作为参数传递给 fun
。
如果您只将 int x[3]
传递给该函数,则只需取消引用一次。