我有两个不同的代码示例。在第一个代码中,可以取消引用:
void getValue(int *myPointer)
{
*myPointer = 10000;
return;
}
int main()
{
int get_the_value = 2;
getValue(&get_the_value);
printf("The value of get_the_value = %d\n", get_the_value);
return 0;
}
但是在下面的代码中,不能在func()中取消引用* B. 我在互联网上有这个代码,他们说:
" B是一个指向int的指针,因此B [0]是一个int,你不能取消引用一个int。"
但是第一个代码中的* myPointer也不是int类型吗?
所以我的问题是:为什么解除引用在第一个代码中工作但在第二个代码中不工作?
#include <stdio.h>
int func(int *B){
*B[0] = 5;
}
int main(void){
int B[3] = {1, 2, 3};
printf("b[0] = %d\n\n", B[0]);
func(&B);
printf("b[0] = %d\n\n", B[0]);
return 0;
}
答案 0 :(得分:6)
B[0]
与*(B + 0)
相同,与*B
相同,所有int
都有B
类型。因此,考虑到B[0]
的类型,您可以编写 <{em> *B
或 B
。
修改强>
您的类型不匹配并没有帮助。
您已将func
中的参数 int *
声明为类型B[0]
;就像我上面所说的,表达式*(B + 0)
相当于*B
,相当于B
。 IOW,下标运算符隐式解除引用main
。
在B
中,您已将int
声明为B
的3元素数组,因此表达式的类型 int [3]
是sizeof
。除非它是&
或一元T [N]
运算符的操作数,或者是用于初始化声明中的字符数组的字符串文字,否则将转换类型T *
的表达式( “衰变”)到类型func
的表达式,表达式的值将是数组的第一个元素的地址。
但是,当您调用&B
时,会传递表达式int (*)[3]
,其类型为int
(指向int *
的3元素数组的指针)。 int (*)[3]
和B
不兼容。现在,只有表达式&B
和B
将评估到同一位置(*B
的第一个元素的地址),因此代码仍将“工作”你写的是B[0]
或func
。但是,您应该将对func( B ); // no & operator.
的呼叫更改为
node_modules
然后类型将匹配。