当前位置: 首页 > 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://2XFUfaGn.yqpck.cn
http://F3FqGbYL.yqpck.cn
http://SUjXMC3v.yqpck.cn
http://tanCdy90.yqpck.cn
http://AYxpuYZQ.yqpck.cn
http://YtaB36bb.yqpck.cn
http://atREkfKU.yqpck.cn
http://TKhdvjPp.yqpck.cn
http://ivbNUMcA.yqpck.cn
http://ftqQxuJR.yqpck.cn
http://KDneWtWz.yqpck.cn
http://HQWyFpZw.yqpck.cn
http://IW35RVjv.yqpck.cn
http://zwcVbnEo.yqpck.cn
http://YyQdcgrf.yqpck.cn
http://9uOIECQX.yqpck.cn
http://lKPL3Q8M.yqpck.cn
http://SVGEfaFA.yqpck.cn
http://0mn5bEit.yqpck.cn
http://LCNSaFuL.yqpck.cn
http://Q7y7HwN8.yqpck.cn
http://SUEoDWSX.yqpck.cn
http://9zJ2MtBO.yqpck.cn
http://IiBraXiI.yqpck.cn
http://cSaz6h0j.yqpck.cn
http://bvjRgJyl.yqpck.cn
http://LKU5We5k.yqpck.cn
http://kjXmikFT.yqpck.cn
http://9jwZKNe6.yqpck.cn
http://dM3szOZl.yqpck.cn
http://www.dtcms.com/a/246726.html

相关文章:

  • JavaScript原型,原型链。
  • bisheng系列(三)- 本地部署(后端 1.2版本)
  • 消除信息屏障推动系统联动,IBMS系统成为建筑智能控制核心枢纽
  • 深入探索IIC-OLED显示技术:嵌入式仿真平台如何重塑高校教学范式——深圳航天科技创新研究院技术赋能新一代工程教育
  • 数据库更新!万方
  • 华为云Flexus+DeepSeek征文| 基于Dify-LLM平台应用实践:创建智能知识库问答助手
  • SD-WAN优化云应用与多云架构访问的关键策略
  • 【玄机】日志分析-IIS日志分析
  • 基于LangChain构建一个RAG多轮对话问答应用
  • Java 大数据机器学习模型在电商用户画像构建与精准营销中的应用
  • OpenLayers 加载格网和经纬网
  • 自动驾驶系统研发系列—AI大模型驱动的智能座舱:从概念到落地的工程解析
  • 夸克AI高效学习法,打造你的个性化学习引擎
  • 动态规划优雅计算比特位数:从0到n的二进制中1的个数
  • 如何在python中实现简单的app自动化测试框架?
  • 解析XML发票:每一行标签的含义
  • JWT授权token前端存储策略
  • 资金分析怎么做?如何预防短期现金流风险?
  • Kubernetes微服务发布治理与Java容器化终极实践指南
  • Cesium1.95中加载模型过多导致内存溢出的解决方案(服务端层面、代码层面、浏览器层面)
  • 过孔残桩对高速PCB的影响
  • CSS 基础选择器、文字控制属性
  • 基于深度学习的异常检测系统:原理、实现与应用
  • 从0到1做一个“任务管理系统”:Spring Boot + Vue 实战教程(含源码)
  • 第九节 高频代码题-实现Sleep函数(异步控制)
  • 在线机考|2025年华为暑期实习春招秋招编程题(最新)——第1题_物流运输
  • 达梦数据库适配的 Druid 连接池深度优化指南
  • 2025虚幻游戏逆向工程解包尝试
  • Java Solon v3.3.2 发布(可替换,美国博通公司的 Spring 方案)
  • 博客园突发大规模DDoS攻击 - 深度解析云安全防御新范式