C ++指针查询

时间:2013-10-19 16:54:01

标签: c++ pointers

这是我对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中运行它并显示“build succeeded”但是给了我堆栈输出并且没有显示实际结果。

2 个答案:

答案 0 :(得分:4)

在解除引用

之前,使p指向有效的内存位置

p = numbers;

并且,不需要以下内容。

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

此外,i应该在for-loop

中以0开头

答案 1 :(得分:1)

指针是存储数字的变量,与任何其他指针一样,但是因为你告诉编译器它是一个指针,编译器允许你使用该值作为内存中的事物的地址,并且语言提供“解除引用”作为说“这个变量所描述的地址的价值”的方式。

想象一下,你要去机场赶飞机。你抓住便条纸并写下你的航班号,然后你带着第二张贴在你的门上。

第一个帖子是“flight *”指针,第二个是“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]相同。

相关问题