这是我对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”但是给了我堆栈输出并且没有显示实际结果。
答案 0 :(得分:4)
在解除引用
之前,使p
指向有效的内存位置
p = numbers;
并且,不需要以下内容。
for(int i=1;i<5;i++)
numbers[i]=*(p+i);
此外,i
应该在for-loop
答案 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]
相同。