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

【C语言】*与深层理解

在 C 语言中,指针(*)和取地址符(&)是两个核心概念,用于实现变量地址的传递和间接访问。理解它们对掌握 C 语言的内存操作至关重要。

1. 指针符号(*)的双重含义

① 声明指针变量

在变量声明时,* 表示 “这是一个指针变量”。指针变量存储的是内存地址,而非实际数据。

int a = 10;      // 普通整型变量
int *p;          // 声明一个指向int类型的指针
② 解引用(Dereference)操作

在表达式中,* 表示 “访问指针指向的内存地址中的值”。

p = &a;          // p存储a的地址
printf("%d", *p); // 输出:10(通过p访问a的值)
*p = 20;         // 修改p指向的内存中的值,即a=20

2. 取地址符(&

& 是一元运算符,用于获取变量的内存地址。

int a = 10;
int *p = &a;     // p存储a的地址
printf("%p", p); // 输出a的内存地址(如:0x7ffeefbff5fc)

3. 结合使用:函数参数传递

① 值传递(普通变量)

函数接收的是变量的副本,无法修改原始变量。

void func(int x) {x = 100;     // 只修改副本,不影响main中的a
}int main() {int a = 10;func(a);     // 传递a的值printf("%d", a); // 输出:10(未改变)
}
② 引用传递(指针变量)

函数接收变量的地址,可以直接修改原始变量。

void func(int *p) {*p = 100;    // 通过指针修改原始变量
}int main() {int a = 10;func(&a);    // 传递a的地址printf("%d", a); // 输出:100(已改变)
}

4. 实现交换的代码应用

在排序代码中,swap 函数通过指针和取地址符实现变量交换:

void swap(int *a, int *b) {if (*a > *b) {int temp = *a;  // 保存a指向的值*a = *b;        // 将b指向的值赋给a指向的内存*b = temp;      // 将temp赋给b指向的内存}
}int main() {int x = 20, y = 15;swap(&x, &y);       // 传递x和y的地址// 此时x=15, y=20
}

  • &x 和 &y 获取变量的地址。
  • int *a 和 int *b 声明指针参数。
  • *a 和 *b 访问并修改原始变量。

5. 常见误区

  • 混淆指针声明和赋值

    int a = 10;
    int *p = a;    // 错误!p需要存储地址,而非值
    int *p = &a;   // 正确
    
  • 忘记解引用

    void func(int *p) {p = 100;   // 错误!修改了指针p本身,而非p指向的值*p = 100;  // 正确
    }
    

总结

  • *:声明指针变量(类型后)或解引用操作(表达式中)。
  • &:获取变量的内存地址。
  • 指针传递:让函数能够修改调用者的变量,是 C 语言实现 “返回多个值” 的常用方式。
http://www.xdnf.cn/news/1008019.html

相关文章:

  • 【Vue3/Typescript】从零开始搭建H5移动端项目
  • 【二分模版------左闭右闭】
  • Vue ⑨-Pinia
  • c++ - 关于 string 的练习题
  • 《深度剖析:Java中用Stanford NLP工具包优化命名实体识别》
  • Redis哨兵机制
  • 获取Unity节点路径
  • ✅ [Dify]明道云同步内容到 Dify 知识库的最佳实践指南
  • 电梯钢带安全无盲区:电梯钢带断丝智慧监测方案让隐患“毫秒现形“
  • SpringCloud-seata集成到nacos
  • 实战二:基于网页端实现与大模型的问答交互
  • 虚拟 DOM Diff 算法详解
  • UE5场景漫游——鼠标控制旋转与第一人称漫游
  • 51la批量创建站点繁琐?悟空统计一站式高效解决方案
  • Spring Data REST技术详解与应用实践
  • HALCON第四讲->几何变换
  • SX1268低功耗sub-1g芯片支持lora和GFSK调制
  • MATLAB griddatan 函数支持的插值方法MATLAB 的 griddatan 函数主要支持以下几种插值方法
  • 关于等效偶极子的概念理解
  • QT5 隐藏控制台窗口方法2025.6.12
  • 【Java面试笔记:实战】41、Java面试核心考点!AQS原理及应用生态全解析
  • FastDFS 分布式文件系统
  • 设计一个类似支付宝或微信支付的在线支付系统
  • 【ubuntu驱动安装】安装nvidia驱动和cuda环境
  • 【洛杉矶实况】这里正在发生什么?
  • shell脚本不同执行方式的区别
  • Python 100个常用函数全面解析
  • python实现层次分析法(AHP)权重设置与稳健性检验完整解决方案
  • 如何学习VBA:3.3.4从初学到精进的方法
  • 2025虚幻游戏逆向工程解包尝试