【问题标题】:why it's impossible to dereference a particular array index with the pointer notation为什么不可能用指针表示法取消引用特定的数组索引
【发布时间】:2017-01-19 19:42:50
【问题描述】:

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

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

【问题讨论】:

  • 因为B[0]的结果不是int*,而是int
  • 因为*x*x[0]不一样。
  • 这是因为在第一种情况下 myPointer 是指向 int 的指针,即存储整数值的地址,但在第二种情况下,变量 B[0] 是 int 类型,即存储整数值。
  • *B[0] = 5 是一种双重取消引用。使用B[0] = 5
  • DeiDei B[0]的结果是什么意思?

标签: c pointers dereference


【解决方案1】:

B[0]*(B + 0)相同,与*B相同,都是int类型。所以给定B的类型,你可以写成either B[0] *B

编辑

您的类型不匹配,这无济于事。

您已将func 中的参数 B 声明为具有int * 类型;就像我上面说的,表达式B[0] 等价于*(B + 0),也就是等价于*B。 IOW,下标运算符隐式取消引用B

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

但是,当您调用func 时,您传递了表达式&amp;B,它的类型为int (*)[3](指向int 的三元素数组的指针)。 int *int (*)[3] 不是兼容的类型。现在,碰巧B&amp;B 两个表达式都将计算到相同的位置(B 的第一个元素的地址),因此如果您编写*B,代码仍将“工作”或B[0]。但是,您应该将对func 的调用更改为

func( B ); // no & operator. 

然后类型将匹配。

【讨论】:

  • 好的,谢谢,最后一个问题。 *B 是整数。那么 *myPointer 是什么数据类型?
  • @Sedem:如果myPointer 被声明为int *myPointer;,那么表达式 *myPointer 的类型为int
猜你喜欢
  • 2014-03-03
  • 2011-02-24
  • 2014-03-30
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2011-05-27
  • 2015-11-05
  • 1970-01-01
相关资源
最近更新 更多