c++ - 简单的指针初始化

标签 c++ pointers

我使用指针已经有一段时间了,我只是想快速检查一下如何初始化整数指针?

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/

相关文章:

c++ - 需要一个指向指针的指针

c - 简单 C 代码中的错误(指针)

c++ - std::vector 重新分配其内存数组时,使用的是复制构造函数还是移动构造函数?

c++ - 从数组的共享指针访问共享指针

c++ - byte[256] 的 Boost::serial_port 和 asio::async_write 超过 200ms

c - 解析C字符串和多指针C字符串

c - 传递一个 int 指针,然后检查值或 null

c++ - 比较 std::wstring 和 std::string

c++ - 这是使用继承的好方法吗?

C编程。指针数组和指向数组的指针