地址运算符在C语言中具体作用是什么?

99ANYc3cd6
预计阅读时长 12 分钟
位置: 首页 C语言 正文

地址运算符 &

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

c语言什么是地址运算符
(图片来源网络,侵删)

它的核心作用是:获取一个变量在内存中的地址。

可以把它想象成一个“取地址器”,当你把变量名放在 & 后面时,它返回的不是变量本身的值,而是这个值存储在内存中的“门牌号”。


为什么需要地址运算符?

地址运算符是 C 语言中指针内存操作的基础,没有它,指针就无从谈起,它的主要用途包括:

  1. 指针初始化:将一个指针变量指向另一个普通变量。
  2. 函数传地址(引用传递):让函数能够修改主调函数中的变量。
  3. 动态内存分配:与 malloc 等库函数配合,使用分配到的内存地址。
  4. 数组操作:数组名在大多数情况下会“退化”为其首元素的地址。

工作原理与示例

让我们通过一个简单的例子来理解它的工作原理。

c语言什么是地址运算符
(图片来源网络,侵删)

示例 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;
}

输出:

c语言什么是地址运算符
(图片来源网络,侵删)
通过变量 score 访问值: 95
通过指针 ptr_to_score 访问值: 95
score 的地址: 0x7ffc8a2b5a78
ptr_to_score 存储的地址: 0x7ffc8a2b5a78

代码解析:

  1. int *ptr_to_score;:声明了一个名为 ptr_to_score 的指针变量。 表示它是一个指针,int 表示它指向的变量类型是 int
  2. ptr_to_score = &score;:这是关键一步。&score 获取 score 的地址,然后将这个地址值赋给指针变量 ptr_to_scoreptr_to_score “指向”了 score
  3. *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 语言指针和内存管理的第一步,也是迈向高级编程的关键一步。

-- 展开阅读全文 --
头像
织梦在线留言本模板如何快速搭建?
« 上一篇 04-27
数组越界会导致什么后果?
下一篇 » 04-27

相关文章

取消
微信二维码
支付宝二维码

目录[+]