这是我非常简单的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中运行此程序,它显示“构建成功”,但显示堆栈输出,但未显示实际结果。

最佳答案

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

想象一下您要去机场乘飞机。您拿起一张便条纸并写下您的航班号,然后再拿一张便条纸作为登机口。

第一个帖子是“ flight *”指针,第二个帖子是“ gate *”,但现在gate *指针为空。

当您到达机场时,您会在登机板上查询航班并记下登机口号码。 “ 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]相同。

关于c++ - C++指针查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19468545/

10-11 22:06
查看更多