a:代表变量本身,它的值是多少。&a:代表变量所在的内存地址。
下面我们来详细分解。

(图片来源网络,侵删)
a (变量本身)
a 是一个变量名,当你使用 a 时,你是在访问或操作这个变量存储的值。
- 数据类型:
a必须先被声明,并且具有一个特定的数据类型(如int,char,double等)。 - 含义:它代表内存中一个或多个字节里存储的。
- 使用场景:
- 赋值:
a = 10;将整数10存入变量a中。 - 读取:
int b = a;读取a的值,并将其赋给变量b。 - 运算:
c = a + 5;读取a的值,与5相加,结果存入c。
- 赋值:
示例:
int a = 100; // 声明一个整型变量a,并初始化为100
// 这里的 'a' 指的是变量a的值,也就是100
printf("a 的值是: %d\n", a); // 输出: a 的值是: 100
int b = a; // 将a的值100复制给b
b = 200; // 修改b的值,这不会影响a
printf("修改后,a 的值是: %d, b 的值是: %d\n", a, b); // 输出: 修改后,a 的值是: 100, b 的值是: 200
&a (变量的地址)
& 是C语言中的取地址运算符 (Address-of Operator),当你使用 &a 时,你是在获取变量 a 在内存中的起始地址。
- 数据类型:
&a的类型是一个指针类型。a是int类型,&a的类型就是int *(指向整型的指针)。 - 含义:它代表一个内存地址,告诉程序变量
a的数据存储在内存的哪个位置。 - 使用场景:
- 指针赋值:
int *ptr = &a;将变量a的地址存储到指针变量ptr中。 - 函数传址:当需要在函数内部修改外部变量的值时,通常会传递变量的地址。
- 输入:
scanf("%d", &a);scanf函数需要知道把用户输入的值存到哪里,所以它需要一个地址。
- 指针赋值:
示例:

(图片来源网络,侵删)
int a = 100; // 声明一个整型变量a
// 这里的 '&a' 指的是变量a的内存地址
// %p 是用于打印地址的格式说明符
printf("a 的内存地址是: %p\n", &a); // 输出一个类似 0x7ffc.... 的十六进制地址
int *ptr; // 声明一个整型指针变量
ptr = &a; // 将a的地址赋给ptr
// 现在ptr指向了a
printf("指针ptr存储的地址是: %p\n", ptr); // 输出与&a相同的地址
printf("指针ptr指向的值是: %d\n", *ptr); // *ptr 是解引用操作,获取ptr指向地址的值,即a的值,输出100
| 特性 | a (变量) |
&a (地址) |
|---|---|---|
| 含义 | 变量存储的值 | 变量在内存中的位置 |
| 类型 | 变量的数据类型 (如 int, char) |
指针类型 (如 int *, char *) |
| 类比 | 一个房子里的家具 | 这个房子的门牌号 |
| 用途 | 进行数值计算、赋值、作为函数参数(传值) | 指向变量、通过指针修改变量、作为函数参数(传址) |
一个形象的比喻
想象你的电脑内存是一个巨大的社区,每个变量都是这个社区里的一所房子。
- 变量
a:这所房子本身,你可以走进去,查看里面有什么家具(值),或者更换家具(修改值)。a = 10,就是给这所房子换了一批新家具。 - 地址
&a:这所房子的门牌号,邮递员(程序)需要这个门牌号才能把信件(数据)准确地送到这所房子,你不能住在门牌号里,但你可以通过门牌号找到那所房子。
一个完整的例子
#include <stdio.h>
void modify_value(int *address) {
// 这个函数接收一个地址
// 它通过地址找到原始的变量,并将其值修改为200
*address = 200; // *address 是解引用,即 "address指向的值"
}
int main() {
int a = 100;
printf("调用函数前:\n");
printf("a 的值是: %d\n", a); // 输出 100
printf("a 的地址是: %p\n", &a); // 输出 a 的地址
// 将 a 的地址 &a 传递给函数
modify_value(&a);
printf("\n调用函数后:\n");
printf("a 的值是: %d\n", a); // 输出 200,因为函数通过地址修改了它
printf("a 的地址是: %p\n", &a); // 地址没有改变
return 0;
}
在这个例子中,main 函数里的变量 a 和 modify_value 函数里的 address 指针指向的是同一个内存地址。modify_value 函数通过指针 address 修改了内存中的值,这个改变在 main 函数中是可见的,这就是 &a(传址)的强大之处。

(图片来源网络,侵删)
