地址运算符 &
地址运算符是 C 语言中的一个一元运算符(只需要一个操作数),它的符号是&(和位运算中的“按位与”是同一个符号,但根据上下文含义不同)。

(图片来源网络,侵删)
它的核心作用是:获取一个变量在内存中的地址。
可以把它想象成一个“取地址器”,当你把变量名放在 & 后面时,它返回的不是变量本身的值,而是这个值存储在内存中的“门牌号”。
为什么需要地址运算符?
地址运算符是 C 语言中指针和内存操作的基础,没有它,指针就无从谈起,它的主要用途包括:
- 指针初始化:将一个指针变量指向另一个普通变量。
- 函数传地址(引用传递):让函数能够修改主调函数中的变量。
- 动态内存分配:与
malloc等库函数配合,使用分配到的内存地址。 - 数组操作:数组名在大多数情况下会“退化”为其首元素的地址。
工作原理与示例
让我们通过一个简单的例子来理解它的工作原理。

(图片来源网络,侵删)
示例 1:获取变量地址
#include <stdio.h>
int main() {
int age = 25; // 定义一个整型变量 age,并赋值为 25
// 使用地址运算符 &age 获取 age 的内存地址
printf("变量 age 的值是: %d\n", age);
printf("变量 age 的内存地址是: %p\n", &age);
return 0;
}
输出可能如下(地址是随机的):
变量 age 的值是: 25
变量 age 的内存地址是: 0x7ffc8a2b5a7c
代码解析:
int age = 25;:操作系统在内存中为int类型的变量age分配了一块空间,并将值25存入其中。&age:这里的&就是地址运算符,它取出变量age的内存地址。%p:这是printf函数中专门用来打印地址的格式说明符。
示例 2:与指针结合使用(最经典的用法)
这是地址运算符最重要的应用场景。
#include <stdio.h>
int main() {
int score = 95; // 一个普通变量
int *ptr_to_score; // 一个指针变量,它用来存储一个 int 类型的地址
// 使用地址运算符 & 将 score 的地址赋给指针 ptr_to_score
ptr_to_score = &score;
printf("通过变量 score 访问值: %d\n", score);
printf("通过指针 ptr_to_score 访问值: %d\n", *ptr_to_score);
printf("score 的地址: %p\n", &score);
printf("ptr_to_score 存储的地址: %p\n", ptr_to_score);
return 0;
}
输出:

(图片来源网络,侵删)
通过变量 score 访问值: 95
通过指针 ptr_to_score 访问值: 95
score 的地址: 0x7ffc8a2b5a78
ptr_to_score 存储的地址: 0x7ffc8a2b5a78
代码解析:
int *ptr_to_score;:声明了一个名为ptr_to_score的指针变量。 表示它是一个指针,int表示它指向的变量类型是int。ptr_to_score = &score;:这是关键一步。&score获取score的地址,然后将这个地址值赋给指针变量ptr_to_score。ptr_to_score“指向”了score。*ptr_to_score:这里的 是解引用运算符(或称间接运算符),它的作用与&相反,它通过指针中存储的地址,去找到内存中对应的值。*ptr_to_score的结果就是score的值,即95。
*& 和 `` 的关系:**
&(地址运算符):从变量到地址。- (解引用运算符):从地址到值。
它们就像一对“互逆”的操作。
示例 3:函数传地址
当函数需要修改外部变量的值时,传地址是标准做法。
#include <stdio.h>
// 函数定义,接收一个整型指针作为参数
void updateValue(int *p) {
*p = 100; // 通过解引用运算符修改指针指向的变量的值
}
int main() {
int myNumber = 10;
printf("调用函数前,myNumber = %d\n", myNumber);
// 将 myNumber 的地址传递给函数
updateValue(&myNumber);
printf("调用函数后,myNumber = %d\n", myNumber);
return 0;
}
输出:
调用函数前,myNumber = 10
调用函数后, myNumber = 100
代码解析:
void updateValue(int *p):函数updateValue接收一个int*类型的参数,即一个指向整数的指针。updateValue(&myNumber):在main函数中,我们使用&myNumber获取myNumber的地址,并将其传递给updateValue函数。*p = 100:在updateValue函数内部,p接收到了myNumber的地址,通过*p(解引用),函数直接操作了main函数中的myNumber变量,将其修改为100,这就是所谓的“引用传递”。
关键区别:& vs sizeof
初学者容易混淆 & 和 sizeof,因为它们都和内存有关,但作用完全不同。
| 运算符 | 名称 | 作用 | 示例 | 结果 |
|---|---|---|---|---|
& |
地址运算符 | 获取变量在内存中的地址。 | int x = 5; &x; |
一个内存地址值(如 0x...) |
sizeof |
长度运算符 | 获取一个类型或变量所占用的字节数。 | sizeof(int); 或 sizeof(x); |
一个整数(如 4) |
地址运算符 & 是 C 语言中一个强大而基础的工具。
- 它是什么? 一个一元运算符,用于获取变量的内存地址。
- 它用来做什么? 主要用于初始化指针、实现函数间的“引用传递”以及进行动态内存管理。
- 它和谁搭档? 它和指针( 解引用运算符)紧密配合,构成了 C 语言直接操作内存的核心机制。
理解 & 是掌握 C 语言指针和内存管理的第一步,也是迈向高级编程的关键一步。
