【问题标题】:Pointers and Arrays in C/C++C/C++ 中的指针和数组
【发布时间】:2013-03-10 12:56:07
【问题描述】:

大家好,我想了解一些关于指针和数组的理论知识。我希望有人能重申我对指针和数组概念的一些怀疑。

假设我有这样的事情

int ia[] = {0,1,2,3,4,5};
ia[2];  // =2

int* ip = &ia[0]; // pointer ip gets the address of element 0 in array ia
ip[2]; // ??
ip[2] = 42; // 

大部分代码显然是理论上的,但我对最后两行有点不确定。首先是说 ip[2] 与说 ip 现在指向数组中的第二个元素一样吗?是否相当于说 *ip = ia[2] ?

我也对最后一行感到困惑。 ip[2] = 42;所以ip指向的对象的第二个元素,那个地址的值是42?或者这是一种解除引用的数组表示法?我只是对发生的事情有点困惑。

【问题讨论】:

  • ip[2]; 是一个有值的语句,它不做任何事情。这与说i; 3;main; 相同。 AKA 它什么都不做。
  • 哦,对不起,我的意思是……它的值是 2 吗?如果 ip 最初指向 ia 数组中的第一个元素,则 ip[2] 值为 2...但逻辑上我在这里丢失了...
  • 这是一个什么都不做的语句。这就像写; - 也是一个什么都不做的声明。相当于根本不写行。这样做对任何事情都没有任何作用。
  • @Patashu,我认为main; 无效(特别是由于 main 很特殊)。也许将其替换为; :)
  • @chris 你试过了吗?

标签: c++ c arrays pointers


【解决方案1】:

当您编写a[i] 时,它会被转换为*(a+i),其中a 是基地址(基本上是一个指针)

同样对于数组,基地址与第一个元素的地址相同,因此a[0] 的地址与a 相同[即a = &a[0]]

所以,ip[2] = 42; 转换为 *(ip+2) = 42 此外,* 在该地址 ip[2] = 42 处给出值表示 *(ip+2) = 42 即在位置 (ip+2) 处的值

【讨论】:

    【解决方案2】:

    ia[n]*(ia+n) 的不同写法,因此int* ip = &ia[0]int *ip = ia 相同。

    您将ia 分配给ip。当然,对于n 的所有值,这也会使ip[n] == ia[n]

    【讨论】:

      【解决方案3】:

      以下创建一个名为 ia 的数组,并将大括号中的数字存储在数组中:

      int ia[] = {0,1,2,3,4,5};
      

      以下内容实际上什么都不做:

      ia[2];
      

      但是,如果我采用上述语句并进行如下更改,它会将值 2 分配给整数 t。这是因为 2 是 ia 中的第三个元素,而 ia[2] 引用了 ia 中的第三个元素。

      t = ia[2];
      

      如果你原来的 ia 声明是

      int ia[] = {0,1,15,3,4,5};
      

      那么你会将 t 分配给 15。

      以下将 ia 中索引 2 处的值更改为 42:

      ip[2] = 42;
      

      现在,ia 由 {0,1,42,3,4,5} 组成。

      这是因为 ia[2] 就像说 *(ia + 2)。如果将 ip 分配给 ia,则 ip 指向 ia 的第一个元素。

      同样,ip[2] 就像说 *(ip + 2)。因此,更改 ip[2] 将更改 ia[2],它们引用相同的内存块。

      【讨论】:

        【解决方案4】:

        a[b]*(a + b) 完全相同。总是。所以ia[2]等价于*(ia + 2)ip[2]等价于*(ip + 2)

        然而,它比这更微妙,因为iaip 有非常不同的类型。 ia 是数组类型;而ip 是指针类型。所以它们不是“相同的”——它们甚至不是同一类型的东西。就像苹果和橘子一样。

        在某些上下文中使用的数组表达式可以隐式转换为指向其第一个元素的指针。如果你写了int *ip = ia;,那将是一个隐式转换——ip 现在指向ia 的第一个元素。和你写的一模一样,int *ip = &ia[0];

        当您再次编写*(ia + 2) 之类的内容时,在这种情况下,数组也被隐式转换为指向其第一个元素的指针,有点像*(&ia[0] + 2)。因为我们知道ip 指向ia 的第一个元素,所以当您在将ia 转换为指针的任何上下文中使用ia 时,它与使用ip 的值相同。这就是 ia[2]ip[2] 工作相同的原因。

        【讨论】:

          猜你喜欢
          • 2023-03-11
          • 1970-01-01
          • 1970-01-01
          • 2015-03-27
          • 1970-01-01
          • 1970-01-01
          • 2013-11-06
          相关资源
          最近更新 更多