<p>指针是存储地址的变量,声明int p表示p用于存放int类型变量的地址,其本身占8字节,初始为野指针;与&分别表示解引用和取地址,必须配对使用;指针类型决定算术运算的偏移量,类型不匹配将导致内存访问错误。</p>

指针就是存地址的变量——它不存数据本身,只存另一个变量在内存里的位置。
int* p; 这行代码到底在干什么
声明一个叫 p 的变量,类型是 int*,意思是“这玩意儿将来要存一个 int 类型变量的地址”。它本身也占内存(通常是 8 字节),但里面放的不是数字 42,而是类似 0x7ffeed42a8b0 这样的地址值。
-
int* p;和int *p;完全等价,*属于类型的一部分,不是乘号也不是解引用 - 刚声明完的
p是野指针,里面内容随机,不能直接*p,否则行为未定义 - 必须先赋值,比如
p = &a;,才能安全使用
&a 和 *p 这两个符号别搞混
& 是取地址,* 是解引用,它们作用对象相反,但必须配对出现才有意义。
-
&a:问“变量a住在哪?”,返回一个地址(比如0x1000) -
*p:问“地址p里写的那个门牌号,对应房间里的东西是什么?”,返回那个地址存的值 - 写成
p = a;是错的——类型不匹配,a是int,p要的是int*
为什么 int* 必须和它指向的类型一致
因为指针算术依赖类型大小。比如 p + 1 不是加 1,而是加 sizeof(int)(通常为 4)。如果用 char* 指向 int 再做加法,地址偏移就全乱了。
立即学习“C++免费学习笔记(深入)”;
- 编译器靠
int*知道该按 4 字节跳,double*知道该按 8 字节跳 - 类型不匹配可能不会报错,但运行时读错内存、越界、数据截断都是常见后果
- 函数参数传
int*却给short*,哪怕值能塞下,++p也会跳错位置
最容易被忽略的一点:指针变量自己也有地址。你用 &p 能拿到它自己的门牌号,这个地址还能再被另一个指针存——这就是多级指针的起点,也是很多崩溃的源头。


















