我目前正在学习指针。当我创建指向具有int类型的数组的指针时,我发现可以直接索引指针而不延迟指针,而编译器仍然在数组中输出准确的项。我不明白为什么这样做,为什么我们不需要首先尊重指针。
不取消引用的代码
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;
}
这给了我输出
然而,当我这样写的时候:
for (int i = 0; i < 5; i++)
{
(*theArray)[i] = i;
}
我的编译器说:错误:表达式必须具有指针到对象的类型。(我使用的是2013。)
任何帮助都将不胜感激。
发布于 2016-11-11 18:31:47
不取消引用的代码 代码
那是不正确的。您肯定是在取消指针的引用:
theArray[i] = i;
那是指针取消引用。[]
运算符取消指针。这相当于:
*(theArray+i) = i;
如您所知,向指针添加或减去一个值会使指针前进或减少,从而产生一个新的指针值,然后该指针被取消引用。
另外:
*p = q;
等于
p[0] = q;
[]
运算符只是向指针添加偏移量和用*
运算符取消引用结果指针的简写。最终的结果完全一样。
发布于 2016-11-11 18:31:13
我不明白为什么这样做,为什么我们不需要首先尊重指针。
第一个版本是正确的:
for(int i = 0; i < 5; i++)
{
theArray[i] = i;
}
因为theArray[i]
实际上是*(theArray + i)
--本质上,指针算法等同于数组索引。
另一方面,第二个版本是不正确的:
for (int i = 0; i < 5; i++)
{
(*theArray)[i] = i;
}
这是因为(*theArray)[i]
实际上是指向数组的指针(而不是数组本身),因此它导致了编译器已经建议的类型不匹配。
发布于 2016-11-11 18:41:26
其他一些答案正确地说,*(theArray + i)
等同于theArray[i]
。但是,我认为您在学习时忽略的一点是,与大多数对象不同,指向数组的指针不是指向随后被取消引用的数组的指针,然后是数组逻辑的指针,它只是指向数组的第一个元素的指针。这就是为什么:
int *myIntPointer = new int[5];
与以下内容几乎相同:
int myIntArray[5]; // "True" array on the stack
但你也可以把它指向别的东西:
int myInt = 10;
delete [] myIntPointer;
myIntPointer = &myInt;
这也是为什么执行以下操作可以给出编译器警告,但也可以工作(取决于编译器):
myIntPointer = myIntArray; // Sometimes works, sometimes doesn't, compiler dependent
这是因为使用new int[size]
分配数组将返回指向int的指针,而不是指向“数组”类型的指针。
数组和指针以这种方式相互作用,这是C/C++的一个奇怪的角落。如果尝试将其中一个"true“数组传递到函数中,也会遇到它。
https://stackoverflow.com/questions/40558977
复制