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

时间:2017-01-19 19:42:50

标签: c pointers dereference

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

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

1 个答案:

答案 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不兼容。现在,只有表达式&BB将评估到同一位置(*B的第一个元素的地址),因此代码仍将“工作”你写的是B[0]func。但是,您应该将对func( B ); // no & operator. 的呼叫更改为

node_modules

然后类型将匹配。