首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么在C++中,为了访问数组中的项,我不需要取消引用指向数组的指针

为什么在C++中,为了访问数组中的项,我不需要取消引用指向数组的指针
EN

Stack Overflow用户
提问于 2016-11-12 02:27:06
回答 5查看 2.3K关注 0票数 4

我目前正在学习指针。当我创建指向具有int类型的数组的指针时,我发现可以直接索引指针而不延迟指针,而编译器仍然在数组中输出准确的项。我不明白为什么这样做,为什么我们不需要首先尊重指针。

不取消引用的代码

代码语言:javascript
代码运行次数:0
运行
复制
int arraySize = 5;
int* theArray = new int[arraySize];

for(int i = 0; i < 5; i++)
{
    theArray[i] = i;
}

for (int i = 0; I < 5; i++)
{
    std::cout << theArray[i] << std::endl;
}

这给了我输出

输出不脱铁

然而,当我这样写的时候:

代码语言:javascript
代码运行次数:0
运行
复制
for (int i = 0; i < 5; i++)
{
    (*theArray)[i] = i;
}

我的编译器说:错误:表达式必须具有指针到对象的类型。(我使用的是2013。)

任何帮助都将不胜感激。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-11-12 02:31:47

不取消引用的代码 代码

那是不正确的。您肯定是在取消指针的引用:

代码语言:javascript
代码运行次数:0
运行
复制
 theArray[i] = i;

那是指针取消引用。[]运算符取消指针。这相当于:

代码语言:javascript
代码运行次数:0
运行
复制
 *(theArray+i) = i;

如您所知,向指针添加或减去一个值会使指针前进或减少,从而产生一个新的指针值,然后该指针被取消引用。

另外:

代码语言:javascript
代码运行次数:0
运行
复制
 *p = q;

等于

代码语言:javascript
代码运行次数:0
运行
复制
 p[0] = q;

[]运算符只是向指针添加偏移量和用*运算符取消引用结果指针的简写。最终的结果完全一样。

票数 6
EN

Stack Overflow用户

发布于 2016-11-12 02:31:13

我不明白为什么这样做,为什么我们不需要首先尊重指针。

第一个版本是正确的:

代码语言:javascript
代码运行次数:0
运行
复制
for(int i = 0; i < 5; i++)
{
    theArray[i] = i;
}

因为theArray[i]实际上是*(theArray + i) --本质上,指针算法等同于数组索引。

另一方面,第二个版本是不正确的:

代码语言:javascript
代码运行次数:0
运行
复制
for (int i = 0; i < 5; i++)
{
    (*theArray)[i] = i;
}

这是因为(*theArray)[i]实际上是指向数组的指针(而不是数组本身),因此它导致了编译器已经建议的类型不匹配。

票数 1
EN

Stack Overflow用户

发布于 2016-11-12 02:41:26

其他一些答案正确地说,*(theArray + i)等同于theArray[i]。但是,我认为您在学习时忽略的一点是,与大多数对象不同,指向数组的指针不是指向随后被取消引用的数组的指针,然后是数组逻辑的指针,它只是指向数组的第一个元素的指针。这就是为什么:

代码语言:javascript
代码运行次数:0
运行
复制
int *myIntPointer = new int[5];

与以下内容几乎相同:

代码语言:javascript
代码运行次数:0
运行
复制
int myIntArray[5];  // "True" array on the stack

但你也可以把它指向别的东西:

代码语言:javascript
代码运行次数:0
运行
复制
int myInt = 10;
delete [] myIntPointer;
myIntPointer = &myInt;

这也是为什么执行以下操作可以给出编译器警告,但也可以工作(取决于编译器):

代码语言:javascript
代码运行次数:0
运行
复制
myIntPointer = myIntArray; // Sometimes works, sometimes doesn't, compiler dependent

这是因为使用new int[size]分配数组将返回指向int的指针,而不是指向“数组”类型的指针。

数组和指针以这种方式相互作用,这是C/C++的一个奇怪的角落。如果尝试将其中一个"true“数组传递到函数中,也会遇到它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40558977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档