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

C语言 指针

1. 什么是指针?

指针本质上是一个变量,但它的特殊之处在于,它存储的不是一个普通的值,而是另一个变量的内存地址

2. 如何声明和初始化指针?

声明:
数据类型 *指针变量名;

  • 数据类型:指这个指针将要指向的变量的数据类型(如 intcharfloat 等)。这决定了指针进行算术运算时的步长。

  • *:星号是一个类型说明符,表明正在声明的是一个指针。

  • 指针变量名:遵循变量的命名规则。

初始化/赋值:
使用取地址运算符 & 来获取一个变量的地址,并将其赋给指针。

int main() {int num = 10;     // 一个普通的整型变量int *p;           // 声明一个整型指针 pp = #         // 将 num 的地址赋值给指针 p,现在 p“指向”了 num// 也可以在声明的同时初始化int *p2 = #return 0;
}
3. 解引用运算符 (*)

解引用运算符 * 用于获取或修改指针所指向的内存地址中存储的值

int main() {int num = 10;int *p = #printf("num 的值: %d\n", num);     // 输出:10printf("通过 p 获取的值: %d\n", *p); // 输出:10 (*p 等价于 num)*p = 20; // 通过指针修改它指向的值printf("修改后 num 的值: %d\n", num); // 输出:20return 0;
}
操作代码示例解释
获取地址&num获取变量 num 的地址
声明指针int *p;声明一个指向 int 的指针 p
给指针赋值p = #让指针 p 存储 num 的地址
解引用(取值)value = *p;获取 p 指向的那个地址里的值
解引用(赋值)*p = 20;向 p 指向的那个地址里写入新值 20
4. 指针的主要用途
  1. 函数参数传递(按引用传递)
    这是指针最重要的用途之一。C语言函数参数默认是“值传递”,即拷贝一份传给函数,函数内部修改不会影响原值。使用指针可以实现“引用传递”,让函数能够修改外部变量的值。

    // 值传递:无法交换成功
    void swap_fail(int a, int b) {int temp = a;a = b;b = temp;
    }// 指针传递(引用传递):可以成功交换
    void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
    }int main() {int x = 5, y = 10;swap_fail(x, y); // x, y 不变swap(&x, &y);    // 传递 x 和 y 的地址,x 和 y 的值被成功交换return 0;
    }

  2. 动态内存分配
    C语言使用 malloccallocrealloc 等函数在堆(Heap) 上动态分配内存,这些函数返回的就是指向新分配内存的指针。

    #include <stdlib.h>
    int main() {int *arr;int n = 5;// 动态分配可以存放5个int的内存arr = (int*)malloc(n * sizeof(int));if (arr == NULL) {// 处理分配失败}// 使用这个数组...arr[0] = 10; // 像普通数组一样使用// 使用完毕后必须释放内存,防止内存泄漏free(arr);return 0;
    }

http://www.dtcms.com/a/351867.html

相关文章:

  • 消防设施安全员证核心考点:消防设施操作与维护高频知识点汇总
  • 聊聊测试覆盖率与测试质量之间的关系
  • 使用powerquery处理数据,取时间或者日期之前的
  • conda环境--相关记录
  • THM TryHack3M Subscribe WP
  • 科技信息差(8.26)
  • 亚马逊云科技免费套餐新政解析与实战:数据分析与可视化平台
  • Slice-100K:推动AI驱动的CAD与3D打印创新的多模态数据集
  • Mysql 判断查询条件索引是否生效步骤,使用说明,示例演示
  • 集成电路学习:什么是ResNet深度残差网络
  • Redis高级篇:在Nginx、Redis、Tomcat(JVM)各环节添加缓存以实现多级缓存
  • Docker-Docker思想
  • 软考-系统架构设计师 计算机系统基础知识详细讲解
  • 今日科技热点 | AI加速变革,量子计算商用化,5G应用新机遇
  • IDEA插件推荐
  • 【prism】Prism 弹窗在 ViewModel 中控制大小的实践总结
  • 工业自动化系统架构-(规划调度执行与协调)
  • 《Java反射与动态代理详解:从原理到实践》
  • 如何让Windows桌面井井有条?
  • 模型解释性:使用 SHAPASH 在贷款被拒原因的解释性(三)
  • Java大厂面试实战:从Spring Boot到微服务架构的深度剖析
  • 【公告】模式更改
  • 县域创新升级:直面瓶颈,重塑成果转化路径
  • 缺少fuser导致oracle自动补丁失败
  • 【第三章】软件测试缺陷管理:从判断到回归的全流程实践指南​
  • 【Erdas实验教程】030:遥感图像光谱增强(彩色IHS变换)
  • 【内网渗透】CVE-2025-21420 利用cleanmgr本地提权
  • Tesseract OCR之基线拟合和单词检测
  • 从0到1详解requests接口自动化测试
  • 遥感专业快速转行 GIS 开发的指南