在C语言编程中,&符号是一个使用频率很高的运算符,它主要有两种完全不同的含义,分别是取地址运算和位与运算,不同场景下的作用差异很大,需要结合上下文判断具体含义。

&符号的第一种含义:取地址运算符
当&符号出现在变量名前面时,它表示取地址运算符,作用是获取对应变量在内存中的存储地址。这个用法在指针操作、函数参数传递等场景中非常常见。
基本使用示例
我们可以通过下面的代码直观看到取地址的效果:
#include <stdio.h>
int main() {
int num = 10;
// 输出num变量的值
printf("num的值为:%dn", num);
// 输出num变量的内存地址,%p是地址的格式化输出占位符
printf("num的地址为:%pn", &num);
return 0;
}
运行上述代码后,会先打印出num的值10,再打印出num在内存中的具体地址,这个地址就是&num运算的结果。
取地址符的常见应用场景
取地址符最常用的场景是给指针变量赋值,让指针指向对应的内存空间:
#include <stdio.h>
int main() {
int score = 95;
int *p; // 定义int类型的指针变量p
p = &score; // 把score的地址赋值给指针p,此时p指向score
printf("通过指针p访问score的值:%dn", *p);
return 0;
}
另外在函数需要修改外部变量的值时,也会用到取地址符,把变量的地址传入函数,函数内部通过指针修改对应地址的内容:
#include <stdio.h>
// 函数作用是给传入的变量加1
void add_one(int *val) {
*val = *val + 1;
}
int main() {
int count = 5;
printf("修改前的count:%dn", count);
add_one(&count); // 传入count的地址
printf("修改后的count:%dn", count);
return 0;
}
&符号的第二种含义:位与运算符
当&符号出现在两个操作数之间时,它表示位与运算符,作用是对两个操作数的二进制位逐位进行与运算,运算规则是:两个对应位都为1时结果位才为1,否则结果位为0。
位与运算示例
我们可以通过具体数值的运算理解位与规则:
#include <stdio.h>
int main() {
int a = 6; // 二进制为 0110
int b = 3; // 二进制为 0011
int result = a & b; // 逐位与运算:0110 & 0011 = 0010,即十进制2
printf("6 & 3的结果是:%dn", result);
return 0;
}
位与运算的常见用途
位与运算经常用来判断一个数的某一位是否为1,比如判断一个整数是否为偶数,只需要判断它的最低位是否为0:
#include <stdio.h>
int main() {
int num1 = 7;
int num2 = 8;
// 最低位为0则是偶数,和1做位与运算,结果为0就是偶数
if (num1 & 1) {
printf("%d是奇数n", num1);
} else {
printf("%d是偶数n", num1);
}
if (num2 & 1) {
printf("%d是奇数n", num2);
} else {
printf("%d是偶数n", num2);
}
return 0;
}
两种用法的区分方法
区分&是取地址符还是位与运算符的方法很简单:
- 如果&后面紧跟一个变量名,且&在变量名左侧没有其他操作数,那么它是取地址运算符
- 如果&的左右两侧都有操作数,那么它就是位与运算符
另外需要注意,&符号的优先级比算术运算符低,但是比赋值运算符高,在复杂表达式中如果需要明确运算顺序,建议加上括号避免逻辑错误。