当前位置:  开发笔记 > 编程语言 > 正文

为什么用指针表示法取消引用特定的数组索引是不可能的

如何解决《为什么用指针表示法取消引用特定的数组索引是不可能的》经验,为你挑选了1个好方法。

我有两个不同的代码示例.在第一个代码中,可以取消引用:

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 

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;
}

John Bode.. 6

B[0]是相同的*(B + 0),它们都是相同的*B,所有这些都有类型int.因此,考虑的类型B,你可以写任何 B[0] *B.

编辑

你有一个类型不匹配,这没有帮助.

你已经声明了参数 Bfunc有型int *; 就像我上面说的那样,表达式B[0]相当于*(B + 0),相当于*B.IOW,下标运算符隐式取消引用B.

main,您已声明B为3元素数组int,因此表达式 的类型Bint [3].除非它是sizeof或一元运算&符的操作数,或者是用于初始化声明中的字符数组的字符串文字,否则类型的表达式T [N]将被转换("衰减")为类型的表达式T *,并且值的类型为expression将是数组的第一个元素的地址.

但是,在调用时func,传递表达式&B,该表达式具有类型int (*)[3](指向3元素数组的指针int). int *并且int (*)[3]不兼容类型.现在,它只是恰巧,两个表达式B,并&B会评估到同一个位置(第一个元素的地址B),所以代码仍然"工作",如果你写的任何*BB[0].但是,您应该将呼叫更改func

func( B ); // no & operator. 

然后类型将匹配.



1> John Bode..:

B[0]是相同的*(B + 0),它们都是相同的*B,所有这些都有类型int.因此,考虑的类型B,你可以写任何 B[0] *B.

编辑

你有一个类型不匹配,这没有帮助.

你已经声明了参数 Bfunc有型int *; 就像我上面说的那样,表达式B[0]相当于*(B + 0),相当于*B.IOW,下标运算符隐式取消引用B.

main,您已声明B为3元素数组int,因此表达式 的类型Bint [3].除非它是sizeof或一元运算&符的操作数,或者是用于初始化声明中的字符数组的字符串文字,否则类型的表达式T [N]将被转换("衰减")为类型的表达式T *,并且值的类型为expression将是数组的第一个元素的地址.

但是,在调用时func,传递表达式&B,该表达式具有类型int (*)[3](指向3元素数组的指针int). int *并且int (*)[3]不兼容类型.现在,它只是恰巧,两个表达式B,并&B会评估到同一个位置(第一个元素的地址B),所以代码仍然"工作",如果你写的任何*BB[0].但是,您应该将呼叫更改func

func( B ); // no & operator. 

然后类型将匹配.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有