【问题标题】:How to create an array of pointers without using vector如何在不使用向量的情况下创建指针数组
【发布时间】:2015-11-28 07:20:36
【问题描述】:

我看到可以使用向量创建一个指针数组,但是我不希望这样。下面的示例是一种创建指向 int 数组的指针的方法吗?

#include <iostream>
using namespace std;

int main() {
    int* arr[4];
    for (int i=0; i<4; ++i) {
        cout<<endl<<arr[i];
    }
}

这会创建一个指向 int 数组的指针,并显示数组中每个索引的内存地址。现在我有几个问题。在没有向量的情况下创建指向 int 数组的指针是否正确?另外,如果我想在给定示例中的每个内存地址中初始化一个值,它是如何完成的?最后为什么&amp;arr 等于arr

【问题讨论】:

  • This makes a pointer to int array 不,它不会那样做。那是一个由 4 个 int 指针组成的数组,像现在这样访问它们中的任何一个都是未定义的行为,因为它们未初始化。
  • zLeon 注意:您在问题中留下了语法陷阱。 “指向 int 数组的指针”不明确。它可以解释为“(指向 int 数组的指针)”或“指向(int 数组)的指针”。您的声明“指针数组”与您的代码匹配的上下文。但这似乎对许多读者没有帮助。

标签: c++ arrays pointers vector


【解决方案1】:

虽然&amp;arr 和简单的arr 可能都给您相同的地址,但它们都非常不同。

使用&amp;arr,你会得到一个指向数组的指针,它的类型是(在你的情况下)int* (*)[4]

当您使用 arr 时,它会衰减为指向第一个元素的指针,并且类型是(同样,在您的情况下)int**

地址相同,但类型不同。


至于数组本身,它的定义很好,你有一个包含四个指向int 的指针的数组。但是,您没有初始化数组的内容,这意味着内容是不确定的,并且以任何方式使用这些指针(即使只是打印它们)都会导致undefined behavior

【讨论】:

  • 对于那些阅读此答案并思考的人,“呃......将打印一个地址。行为非常明确。”请注意,该标准没有指定要打印的地址,因为它尚未分配,这绝对是未定义的行为。您可能拥有自动将指针清空的系统,您可能会让它显示堆栈上的任何垃圾,并且它可能指向威廉莎士比亚的未删节作品。都是可以接受的解释。
【解决方案2】:

您提出的方法不会使指针指向 int 数组。取而代之的是,它创建了一个指向 int 数组的指针。通常任何数组的名称都代表一个指向它自身的指针。或者&amp;arr[0]也代表它。

所以我希望你知道为什么&amp;arr等于arr

创建一个指向 int 数组的指针

int arr[4];
int* p = arr; //pointer to int array

初始化数组中的每个元素

(1) 使用指针算法

int size = 4;
int* p = arr;
for (int i = 0; i < size; i++)
{
    *p = i; // assigning each element i
    p++; //pointing to next element 
}

(2) 使用运算符[]

int size = 4;
for (int i = 0; i < size; i++)
{
    arr[i] = i; // assigning each element i
}

【讨论】:

    【解决方案3】:

    &arr 为您提供以基地址开头的数组地址,即第一个元素的地址。

    arr 给出第一个元素的地址。

    因此你得到两个相同的结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      相关资源
      最近更新 更多