我有两个不同的代码示例.在第一个代码中,可以取消引用:
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类型吗?
所以我的问题是:为什么解除引用在第一个代码中工作而在第二个代码中不起作用?
#includeint 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; }
John Bode.. 6
B[0]
是相同的*(B + 0)
,它们都是相同的*B
,所有这些都有类型int
.因此,考虑的类型B
,你可以写任何 B[0]
或 *B
.
编辑
你有一个类型不匹配,这没有帮助.
你已经声明了参数 B
的func
有型int *
; 就像我上面说的那样,表达式B[0]
相当于*(B + 0)
,相当于*B
.IOW,下标运算符隐式取消引用B
.
在main
,您已声明B
为3元素数组int
,因此表达式 的类型B
为int [3]
.除非它是sizeof
或一元运算&
符的操作数,或者是用于初始化声明中的字符数组的字符串文字,否则类型的表达式T [N]
将被转换("衰减")为类型的表达式T *
,并且值的类型为expression将是数组的第一个元素的地址.
但是,在调用时func
,传递表达式&B
,该表达式具有类型int (*)[3]
(指向3元素数组的指针int
). int *
并且int (*)[3]
不兼容类型.现在,它只是恰巧,两个表达式B
,并&B
会评估到同一个位置(第一个元素的地址B
),所以代码仍然"工作",如果你写的任何*B
或B[0]
.但是,您应该将呼叫更改func
为
func( B ); // no & operator.
然后类型将匹配.
B[0]
是相同的*(B + 0)
,它们都是相同的*B
,所有这些都有类型int
.因此,考虑的类型B
,你可以写任何 B[0]
或 *B
.
编辑
你有一个类型不匹配,这没有帮助.
你已经声明了参数 B
的func
有型int *
; 就像我上面说的那样,表达式B[0]
相当于*(B + 0)
,相当于*B
.IOW,下标运算符隐式取消引用B
.
在main
,您已声明B
为3元素数组int
,因此表达式 的类型B
为int [3]
.除非它是sizeof
或一元运算&
符的操作数,或者是用于初始化声明中的字符数组的字符串文字,否则类型的表达式T [N]
将被转换("衰减")为类型的表达式T *
,并且值的类型为expression将是数组的第一个元素的地址.
但是,在调用时func
,传递表达式&B
,该表达式具有类型int (*)[3]
(指向3元素数组的指针int
). int *
并且int (*)[3]
不兼容类型.现在,它只是恰巧,两个表达式B
,并&B
会评估到同一个位置(第一个元素的地址B
),所以代码仍然"工作",如果你写的任何*B
或B[0]
.但是,您应该将呼叫更改func
为
func( B ); // no & operator.
然后类型将匹配.