如何使用数组指针?

时间:2011-12-05 20:47:53

标签: c++ arrays syntax

我是C ++的新手,我无法弄清楚指针是如何与数组相关的。我无法弄清楚我应该如何访问数组指针中的元素。这就是我的意思:

int* array[10];

(*array)[5] = 4;// This works but I don't think that that is the correct way to do it
array->[5] = 4; // Is there a similar method such as what you would use for a normal pointer?

此外,我想知道你是否可以初始化一个数组指针,就像你可以用大括号中的数组初始化一个常规数组。

int  array[] =  {0, 2, 45, 235};// Works
int* array[] =  {0, 2, 45, 235};// does not work
int* array[] = &{0, 2, 45, 235};// does not work

编辑: 有些人建议使用没有指针的数组。但是,如果我这样做,每当我将它传递给像普通变量一样的方法时,它不会复制吗?

10 个答案:

答案 0 :(得分:4)

int * array[10]

那不是数组指针。它是 指针的数组。你把指针放在里面,而不是整数。

数组指针如下所示:

int (*ptr)[10] = &array;

但这也不是整数。它填充了10个整数的数组。更准确地说,它指向10个整数的单个数组,或指向10个整数数组的第一个数组。

答案 1 :(得分:1)

此声明:

int* array[10];

......可能不是你认为的那样。这是一个包含10个指针到int的数组的声明。它不是10 int的数组。

由于您尚未实际初始化这10个指针中的每一个,因此尝试访问其中一个指针会引发未定义的行为。这就是你在这里做的事情:

(*array)[5] = 4;

......再来一次:

array->[5] = 4;

你可能需要的是10个int的数组,你可以这样声明:

int array[10];

现在您可以像这样访问项目:

array[5] = 4;

但是,虽然我们讨论数组的主题,但为什么不使用vector来避免所有这些混乱呢?

vector<int> vi;
vi.push_back(1);
/* ... */

答案 2 :(得分:0)

对于像int这样的纯数据类型数组 - &gt;操作员没有被确定。 *运算符是解除引用运算符,为您提供每个指针指向的元素。在你的情况下为int *。

对于问题的第二部分,只有方法一对于使用常量数据初始化数组是有效的。

答案 3 :(得分:0)

对于第一,因为array是一个10 int*的数组,它指向一些随机内存位置,你需要使指针指向int(这也应该回答你的下一个问题):

// 10 ints on the heap held in an array on the stack
int* array[] = {new int, new int, new int, new int, new int, new int, new int, new int, new int, new int};

*array[3] = 32; // [] has higher precedence than * so this is like *(array[3])

// remember to loop through and delete each one
for (int i = 0; i < 10; ++i)
    delete array[i];

答案 4 :(得分:0)

在您的示例中,您正在尝试初始化指针数组。基本上,我认为没有办法初始化指向数组的指针,除了

int array[] = {0,2,3,4};
int *ptr = array;

但说实话,我不确定你是否要求这样做。

答案 5 :(得分:0)

一般来说:

  • 数组的符号名称(int arr[],名称为arr)通常像指向其头部的指针一样工作;所以arr[3] == *(arr+3)。 (注意,C / C ++指针算法以指针的大小为单位,而不是字节。)
  • 使用int* arr[]创建数组是指向整数指针数组,而不是整数数组。

在您的示例中,您尝试将整数放入指定用于指针的插槽中。你想要这样做的可能性极小。

答案 6 :(得分:0)

数组本身就是一个指针

它指向基地址

这将有助于

http://pw1.netcom.com/~tjensen/ptr/ch2x.htm

答案 7 :(得分:0)

不,因为指针必须指向一个对象,并且您将其指向初始化列表,而不是数组对象。您必须使用初始化列表实例化一个数组对象,指针指向。

同样,你不能拥有

int* = &7;

答案 8 :(得分:0)

传递数组时,实际传递的指针指向数组的第一个元素。所以你应该坚持不要混合数组和指向数组的指针。如前所述,数组被隐式表示为指针。如果你刚刚开始,首先研究基本数组,然后指针,然后继续动态内存分配。指针是非常棘手的,所以你可能想要缓慢而彻底地使用它。它会为你节省很多时间。

答案 9 :(得分:0)

写作时

int* array[10]; 

你实际上并没有创建一个整数数组,或者说是一个整数指针数组。你正在做的是分配40个字节的数据(因为一个整数占用4个字节)。