我使用指针已经有一段时间了,我只是想快速检查一下如何初始化整数指针?
a) int *tmpPtr = 0;
b) int *tmpPtr = null;
c) int a = 0;
int *tmpPtr = &a;
编辑
感谢您迄今为止的所有回答。有趣的是,如果我初始化 指针如下,那么 mem::copy 操作就可以正常工作了。
int tmp = 0;
int *tmpPtr = &tmp;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
但是,如果我这样做:
int *tmpPtr = 0;
Mem::Copy((void*)tmpPtr, basepointer(), sizeof(int));
然后我在 mem::copy 期间发生崩溃...
奇怪!
最佳答案
简单的问题很好,我认为 SO 是针对所有级别的,而不仅仅是精英。
C 中没有 null
(除非您自己定义)。可以通过以下两种方式之一来初始化空指针:
int *p = 0;
int *p = NULL;
如果你在此之后取消引用 p
,你可能会遇到访问冲突(我相信根据标准这是未定义的行为,所以真的,任何事情都可能发生,包括总计宇宙的毁灭——它甚至可能继续正常运行,但我不会依赖它)。
要获得指向实整数的指针,只需使用:
int a = 7;
int *p = &a;
使用地址运算符。
重新编辑,一点都不奇怪,您只需将其可视化即可。假设所有变量都是从内存位置 100 开始创建的,并且整数和指针的长度都是 4 个字节。将您的两种情况分解为最简单的形式:
int x = 2;
int *px = 0; int *px = &x;
+-----+ +-----+
px(100): | 0 | x(100) | 2 |
+-----+ +-----+
px(104) | 100 |
+-----+
然后你执行命令
*px = 7;
试图改变px
所指向的变量。
在左侧,您将尝试将值 7 写入内存位置 0。这是一件坏事;很少有系统允许您在不崩溃的情况下执行此操作,甚至更少的系统会允许它完全没有任何不利影响(某些版本的 HP-UX 实际上可以正常工作)。
右侧是应该发生的事情。从 px
获取的值是 100,因此值 7 被写入该内存位置,按预期更改 x
。
我经常发现图片(甚至是原始的 ASCII 艺术图片,因为我不是鲁本斯或波提切利)有助于阐明概念。希望它对您有所帮助。
关于c++ - 简单的指针初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1367363/