当前位置: 首页 > 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.xdnf.cn/news/1367407.html

相关文章:

  • 【设计模式】 面向对象基础
  • 打破技术壁垒的先进制造框架的智慧工业开源了
  • 如何利用ArcGIS探究环境与生态因子对水体、土壤、大气污染物的影响?
  • Mac安装mitmproxy及操作对监控的请求
  • Android Glide常见问题解决方案:从图片加载到内存优化
  • 使用 Docker、Jenkins、Harbor 和 GitLab 构建 CI/CD 流水线
  • Linux文件系统深入解析:从原理到实践
  • 通义灵码插件——AI 重构表单开发!半小时搭建可视化拖拽系统,效率碾压传统模式
  • 面试:Spring
  • MySQL 面试题系列(三)
  • week5-[循环结构]听歌
  • cuda编程笔记(16)--使用 cuDNN 实现卷积、激活、池化等反向操作
  • 淘宝/天猫商品详情API数据解析【附代码】
  • AP8105 PFM升压芯片数据手册
  • 支持向量机(SVM)学习笔记
  • 如何安装 VS2019 和 .NET Core SDK 2.2.301(winx64)?完整操作步骤(附安装包下载)
  • Ubuntu22.04安装OBS
  • 【软考论文】论自动化测试方法及其应用
  • 办公无纸化的关键:cpolar让Paperless-ngx远程扫描更便捷
  • 【Elasticsearch】k-NN 搜索深度解析:参数优化与分数过滤实践
  • 【SystemUI】锁屏来通知默认亮屏Wake模式
  • 32.Ansible平台搭建
  • 1424. 对角线遍历 II
  • 2024年Engineering SCI2区,面向工程管理的无人机巡检路径与调度,深度解析+性能实测
  • 计算机毕业设计 java 药店药品信息管理系统 基于 Java 的药店药品管理平台Java 开发的药品信息系统
  • 设计模式:原型模式(Prototype Pattern)
  • 如何通过虚函数实现多态?
  • 实现自己的AI视频监控系统-第二章-AI分析模块2
  • 【git使用场景】本地仓库与远程仓库存在独立历史
  • ​Visual Studio + UE5 进行游戏开发的常见故障问题解决