当前位置: 首页 > 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 语言实现 “返回多个值” 的常用方式。

相关文章:

  • 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中加载模型过多导致内存溢出的解决方案(服务端层面、代码层面、浏览器层面)
  • 沈阳亚洲城属于哪个社区/北京厦门网站优化
  • 海外营销推广 平台/青岛设计优化公司
  • 企业网站建设的基本内容/seo引擎优化方案
  • 做网站不错的公司/网络推广怎样做
  • 一键生成微信小程序平台/济南seo小黑seo
  • 模版网站怎么做/事件营销的案例有哪些