当前位置: 首页 > news >正文

C语言中*a与a的区别和联系

1. &a(取地址操作符)

  • 作用:获取变量 a 在内存中的地址

  • 结果类型:返回一个指针,类型是 a 的类型*

  • 适用对象:任何非寄存器变量(例如 intfloat、数组、结构体等)。

  • 示例

int a = 10;
int *p = &a;  // p 指向 a 的地址

 

  • &a 的类型是 int*,表示“指向 int 的指针”。

2. *a(解引用操作符)

  • 作用:访问指针 a 指向的

  • 结果类型:返回指针 a 指向的实际数据,类型是 a 的类型 去掉一个 *

  • 适用对象:必须是一个指针变量

  • 示例

int a = 10;
int *p = &a;  // p 保存 a 的地址
int value = *p; // value = 10(通过 p 解引用获取 a 的值)
  • *p 的类型是 int,表示“p 指向的 int 值”。

3. 区别对比

4. 联系与结合使用

(1) 互为逆操作

  • 如果 a 是一个指针,且 p = &a,则:

int a = 10;
int *p = &a;
assert(*p == a);     // *p 等价于 a
assert(p == &a);     // p 保存的是 a 的地址

(2) 多级指针

  • 可以通过嵌套 & 和 * 操作符处理多级指针:

int a = 10;
int *p = &a;       // p 是 int* 类型
int **pp = &p;     // pp 是 int** 类型
assert(**pp == 10); // **pp 等价于 *(*pp) -> *p -> a

(3) 函数参数传递

  • &a 用于传递变量的地址(如函数修改外部变量):

void modify(int *ptr) {
    *ptr = 20; // 通过指针修改外部变量的值
}

int main() {
    int a = 10;
    modify(&a); // 传递 a 的地址
    printf("%d", a); // 输出 20
}

5. 常见错误

(1) 对非指针变量使用 *

int a = 10;
int b = *a; // 错误!a 不是指针,无法解引用

(2) 对寄存器变量使用 &

register int a = 10;
int *p = &a; // 错误!寄存器变量没有内存地址

(3) 未初始化指针的解引用

int *p;      // 未初始化
int value = *p; // 未定义行为!可能崩溃或数据错误

6. 总结

  • &a:获取变量地址,生成指针。

  • *a:访问指针指向的值,要求 a 必须是指针。

  • 核心区别

    • &a 是从数据到指针(值 → 地址)。

    • *a 是从指针到数据(地址 → 值)。

  • 联合使用场景:多级指针、函数参数传递、动态内存管理等。

 

相关文章:

  • 数据结构——B树、B+树、哈夫曼树
  • 安全测试理论
  • JavaScript 性能优化实战
  • 【云馨AI-大模型】自动化部署Dify 1.1.2,无需科学上网,Linux环境轻松实现,附Docker离线安装等
  • 【C++教程】setw()函数的使用方法
  • 深入理解Linux中的SCP命令:使用与原理
  • Hutool中的相关类型转换
  • 山东大学数据结构课程设计
  • linux--时区查看和修改
  • 动态规划-01背包
  • 牛客网【模板】二维差分(详解)c++
  • 分区表的应用场景与优化实践
  • 001-JMeter的安装与配置
  • 【操作系统笔记】操作系统的功能
  • 【Linux】线程库
  • 常见中间件漏洞攻略-Jboss篇
  • 多线程编程中什么时候使用锁和原子操作
  • Leetcode 3495. Minimum Operations to Make Array Elements Zero
  • 《基于Flask的态势感知系统》开题报告
  • Edge浏览器如何默认启动某个工作区 / 为工作区添加快捷方式
  • 10台核电新机组获核准,上海核电厂商独揽超500亿元订单
  • 专访丨青年作家杜梨:以动物的视角去观察这个世界
  • 文化润疆|让新疆青少年成为“小小博物家”
  • 校长套取学生伙食费设小金库,重庆通报6起违反八项规定典型问题
  • 重新认识中国女性|婚姻,古代传统家庭再生产的根本之道
  • 女子隐私被“上墙”莫名遭网暴,网警揪出始作俑者