C语言中a与&a有何本质区别?

99ANYc3cd6
预计阅读时长 10 分钟
位置: 首页 C语言 正文
  • a:代表变量本身,它的值是多少。
  • &a:代表变量所在的内存地址

下面我们来详细分解。

c语言中 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 的类型是一个指针类型aint 类型,&a 的类型就是 int * (指向整型的指针)。
  • 含义:它代表一个内存地址,告诉程序变量 a 的数据存储在内存的哪个位置。
  • 使用场景
    • 指针赋值int *ptr = &a; 将变量 a 的地址存储到指针变量 ptr 中。
    • 函数传址:当需要在函数内部修改外部变量的值时,通常会传递变量的地址。
    • 输入scanf("%d", &a); scanf 函数需要知道把用户输入的值存到哪里,所以它需要一个地址。

示例:

c语言中 a与a 的意思
(图片来源网络,侵删)
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 函数里的变量 amodify_value 函数里的 address 指针指向的是同一个内存地址modify_value 函数通过指针 address 修改了内存中的值,这个改变在 main 函数中是可见的,这就是 &a(传址)的强大之处。

c语言中 a与a 的意思
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
dede list标签怎么用?参数怎么写?
« 上一篇 02-19
C程序设计语言PDF哪里找?
下一篇 » 02-19

相关文章

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

目录[+]