指针的增量不起作用。它';我很难理解什么是';这是什么 我最近学习了C++中指针的一些基本知识。因此,我理解数组的名称只是默认情况下指向数组第一个位置的指针。我真的不明白为什么第一个代码工作得很好,而第二个代码在这行显示了一个错误:tab=tab+1
你能给我解释一下为什么这么模棱两可吗指针的增量不起作用。它';我很难理解什么是';这是什么 我最近学习了C++中指针的一些基本知识。因此,我理解数组的名称只是默认情况下指向数组第一个位置的指针。我真的不明白为什么第一个代码工作得很好,而第二个代码在这行显示了一个错误:tab=tab+1,c++,pointers,types,increment,C++,Pointers,Types,Increment,你能给我解释一下为什么这么模棱两可吗 #包括 int main() { int*选项卡; tab=newint[5]{0,1,2,3,4}; 对于(int i=0;i第一个代码“起作用”,因为tab被声明为实际指针,您可以为它分配另一个指针。但是该代码也失败了,因为调用delete[]时,由于tab不再指向new[]返回的原始内存,因此它具有未定义的行为 第二个代码不起作用,因为tab被声明为数组,而不是指针。需要时,它会衰减为指针,但您无法将指针分配给数组 因此,我理解数组的名称只是默认情况下
#包括
int main()
{
int*选项卡;
tab=newint[5]{0,1,2,3,4};
对于(int i=0;i第一个代码“起作用”,因为tab
被声明为实际指针,您可以为它分配另一个指针。但是该代码也失败了,因为调用delete[]
时,由于tab
不再指向new[]
返回的原始内存,因此它具有未定义的行为
第二个代码不起作用,因为tab
被声明为数组,而不是指针。需要时,它会衰减为指针,但您无法将指针分配给数组
因此,我理解数组的名称只是默认情况下指向数组第一个位置的指针
不,那是错误的。数组不是指针,指针也不是数组
由于数组可以衰减到其第一个元素的地址,因此可以编写int*tab_ptr=tab;
以获取指向第一个元素的指针:
#include <iostream>
int main()
{
int tab[5] = {0, 1, 2, 3, 4};
int* tab_ptr = tab;
for(int i=0; i<5; i++)
{
std::cout << *tab_ptr << std::endl;
tab_ptr = tab_ptr+1;
}
}
因为数组会衰减到tab+1
中的一个地址,并且tab+1
是一个指针,但是您不能将结果指针分配给数组tab
第一个版本没有这个问题,因为选项卡
确实是指向动态数组的指针。“我知道数组的名称只是一个指针”。这是错误的。数组不是指针,指针也不是数组。数组在传递给函数时会衰减为指向第一个元素的指针,但tab
是数组。我实际上讨厌“衰减为指针”的措辞-我认为更准确的说法是,未经修饰的数组实际上会衰减为一个地址-第一个元素的地址。地址不是左值-地址不是可以放入值的内存块-地址是一个值。至于“数组是指针”-同样,不是。数组是具有有效地址的实际内存块-数组存在。指针是包含地址的变量-指针中包含的地址可能有效,也可能无效。@AndrewHenle,标准称之为“衰减到指针”(,)。通常我看到的是“地址”用来指指针对象的值,就像“数字”是一个算术类型的对象的值一样。所以在我的书中,“衰减为指针”是可以的,如果你记住所说的指针是一个prvalue的话。指针是变量,用这样的措辞,int*x[5];
不是一个“指针”数组,因为元素不是变量,而只是对象。@HolyBlackCat为True,但我试图简化解释。-)好的,所有答案都是thx,但关于第二个代码我有一个不同的问题。如果我写*(tab+I)为什么它会工作?@Quarol因为tab+I
是指向第I个元素的指针。*(tab+I)
与选项卡[i]相同。
好的,我开始了解这个了
#include <iostream>
void foo(int t[]){
for(int i=0; i<5; i++)
{
std::cout << *t << std::endl;
t = t+1;
}
}
int main()
{
int tab[5] = {0, 1, 2, 3, 4};
foo(tab);
}
<source>:23:13: error: incompatible types in assignment of 'int*' to 'int [5]'
23 | tab = tab+1;
| ~~~~^~~~~~~