Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
指针的增量不起作用。它';我很难理解什么是';这是什么 我最近学习了C++中指针的一些基本知识。因此,我理解数组的名称只是默认情况下指向数组第一个位置的指针。我真的不明白为什么第一个代码工作得很好,而第二个代码在这行显示了一个错误:tab=tab+1_C++_Pointers_Types_Increment - Fatal编程技术网

指针的增量不起作用。它';我很难理解什么是';这是什么 我最近学习了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;
      |         ~~~~^~~~~~~