【发布时间】:2021-05-30 21:18:02
【问题描述】:
我最近学习了一些 C++ 指针的基础知识。所以我知道数组的名称只是一个默认设置为数组第一个位置的指针。而且我真的不明白为什么第一个代码可以正常工作,而第二个代码显示错误:tab = tab+1;
你能解释一下为什么它如此模棱两可吗?
#include <iostream>
int main()
{
int *tab;
tab = new int[5] {0, 1, 2, 3, 4};
for(int i=0; i<5; i++)
{
std::cout << *tab << std::endl;
tab++;
}
delete []tab;
}
#include <iostream>
int main()
{
int tab[5] = {0, 1, 2, 3, 4};
for(int i=0; i<5; i++)
{
std::cout << *tab << std::endl;
tab = tab+1; // ERROR
}
}
【问题讨论】:
-
“我知道数组的名字只是一个指针”。这是错误的。
-
数组不是指针,指针也不是数组。例如,当传递给函数时,数组确实会衰减到指向第一个元素的指针,但
tab是一个数组 -
我实际上讨厌“衰减到指针”的措辞 - 我相信说朴素的数组实际上衰减到 address - 第一个元素的地址更准确。并且 address 不是左值 - 地址不是可以放入值的内存块 - 地址 is 是一个值。至于“数组是指针” - 再次,不。数组是实际内存的块,具有一个有效的地址 - 数组存在。指针是保存地址的变量 - 指针中保存的地址可能有效也可能无效。
-
@HolyBlackCat 是的,但我试图简化解释。 ;-)
标签: c++ pointers types increment