0

这是我对 C++ 指针的非常简单的介绍性代码,

#include <iostream>

int main(int argc, const char* argv[])
{
    int *p = 0, numbers[5];

    *p = 10;
    *(p+1) = 20;
    *(p+2) = 30;
    *(p+3) = 30;
    *(p+4) = 40;

    for (int i = 1; i < 5; i++)
        numbers[i] = *(p + i);

    for (int i = 1; i < sizeof(numbers); i++)
        std::cout << numbers[i] << '\n';

    return 0;
}

我在 Xcode 中运行它,它显示“构建成功”,但给了我堆栈输出,并没有显示实际结果。

4

2 回答 2

4

p取消引用之前指向一个有效的内存位置

p = numbers;

而且,不需要跟随。

for(int i=1;i<5;i++)
    numbers[i]=*(p+i);

此外,i应该在 for 循环中以 0 开头

于 2013-10-19T16:55:34.330 回答
1

指针是存储数字的变量,就像任何其他变量一样,但是因为您告诉编译器它是一个指针,编译器允许您将该值用作内存中事物的地址,并且该语言提供“取消引用”作为一种说法“此变量描述的地址处的值”。

想象一下,你要去机场赶飞机。你拿一张便利贴写下你的航班号,然后随身携带第二张便利贴作为登机口。

第一篇文章是“飞行*”指针,第二篇文章是“门*”,但现在门*指针为空。

当你到达机场时,你在板上查看你的航班并记下登机口号码。“3A”。现在你的门*贴是有效的。

但是便利贴本身不是您的登机口,它只是指向它:您仍然必须“取消引用”便利贴才能到达您的航班 - 也就是说,穿过机场到 3A 登机口 :)

在编程中,变量不能为空,所以大家一致认为地址为 0 的指针是“空的”和“非法的”。程序在尝试使用空指针时崩溃。按照惯例,C 中有一个名为“NULL”的宏,旨在将“空指针”与值 0 区分开来。C++ 继承了这一点,但在 C++11 中他们引入了一个新常量“nullptr”。

您的代码以以下方式打开:

int *p = 0;

这吸引了很多人。它看起来与我们通过指针赋值时的语法相同:

*p = 10;

但实际发生的是,您声明了一个类型为“int *”的变量 p,并将一个值分配给 p,而不是 *p。

int *p;
p = 0;
*p = 10;

您需要将“p”指向一些整数进行存储,或者:

p = numbers;

但这将使 p 指向与数字相同的存储。但是意识到,然后,像这样的操作

numbers[i] = *(p+i);

现在都是多余的——if (p == numbers)那么*(p+i)就是说的一样numbers[i]

于 2013-10-19T17:47:15.040 回答