【C语言】指针篇

目录

  • C 语言指针概述
    • 指针的声明和初始化
      • 声明指针
      • 初始化指针
    • 指针的操作
      • 解引用操作
      • 指针算术运算
    • 指针的用途
      • 动态内存分配
      • 作为函数参数
  • 指针与数组
    • 数组名作为指针
    • 通过指针访问数组元素
    • 指针算术和数组
    • 数组作为函数参数
    • 指针数组和数组指针
      • 指针数组
      • 数组指针
  • 函数指针
    • 函数指针的定义和声明
    • 函数指针的初始化和使用
    • 函数指针作为函数参数(回调函数)
    • 函数指针数组
  • 动态内存分配
    • 概念
    • 动态内存分配函数
      • malloc 函数
      • calloc 函数
      • realloc 函数
      • free 函数
    • 示例代码
    • 注意事项
  • 常见错误与规避
    • 内存泄漏(Memory Leak)
    • 空指针引用(Null Pointer Dereference)
    • 重复释放内存(Double Free)
    • 越界访问(Buffer Overflow)
    • realloc 使用不当

C 语言指针概述

在 C 语言中,指针是一个非常重要且强大的概念。它是一个变量,其值为另一个变量的地址,即内存位置的直接地址。可以把指针想象成一个特殊的变量,它存储的不是普通的数据,而是内存中某个变量的地址。通过指针,我们可以直接访问和操作该内存地址上存储的数据。

指针的声明和初始化

声明指针

在 C 语言中,声明指针的一般语法如下:

数据类型 *指针变量名;

其中,数据类型 表示该指针所指向的变量的数据类型,* 是指针声明符,用于表明这是一个指针变量。例如:

int *p;  // 声明一个指向整型变量的指针p
float *q; // 声明一个指向浮点型变量的指针q

初始化指针

指针可以在声明时进行初始化,也可以在声明后再赋值。指针初始化时,需要将一个变量的地址赋给它。使用 & 运算符可以获取变量的地址。示例如下:

#include <stdio.h>int main() {int num = 10;int *p = &num;  // 声明并初始化指针p,使其指向变量numprintf("变量num的地址: %p\n", &num);printf("指针p存储的地址: %p\n", p);return 0;
}

在上述代码中,&num 表示变量 num 的地址,将其赋给指针 p,这样 p 就指向了 num。

指针的操作

解引用操作

通过指针访问其所指向的变量的值,需要使用 * 运算符,这称为解引用操作。示例如下:

#include <stdio.h>int main() {int num = 10;int *p = &num;printf("变量num的值: %d\n", num);printf("通过指针p访问num的值: %d\n", *p);*p = 20;  // 通过指针p修改num的值printf("修改后变量num的值: %d\n", num);return 0;
}

在上述代码中,*p 表示指针 p 所指向的变量的值,通过 *p = 20; 可以修改 num 的值。

指针算术运算

指针可以进行一些算术运算,如加法、减法等。指针算术运算的结果取决于指针所指向的数据类型的大小。示例如下:

#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5};int *p = arr;  // 指针p指向数组arr的首元素printf("p指向的元素的值: %d\n", *p);p++;  // 指针p向后移动一个位置printf("p移动后指向的元素的值: %d\n", *p);return 0;
}

在上述代码中,p++ 使指针 p 向后移动一个 int 类型的位置,即移动了 sizeof(int) 个字节。

指针的用途

动态内存分配

C 语言提供了一些函数(如 malloc、calloc、realloc 等)用于动态分配内存,这些函数返回的是一个指针,通过指针可以访问和管理动态分配的内存。示例如下:

#include <stdio.h>
#include <stdlib.h>int main() {int *p = (int *)malloc(sizeof(int));  // 动态分配一个int类型的内存空间if (p == NULL) {printf("内存分配失败\n");return 1;}*p = 10;printf("动态分配内存中存储的值: %d\n", *p);free(p);  // 释放动态分配的内存return 0;
}

作为函数参数

指针可以作为函数参数,通过指针传递参数可以在函数内部修改实参的值。示例如下:

#include <stdio.h>void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}int main() {int x = 10, y = 20;printf("交换前: x = %d, y = %d\n", x, y);swap(&x, &y);printf("交换后: x = %d, y = %d\n", x, y);return 0;
}

在上述代码中,swap 函数接受两个指针作为参数,通过指针可以交换 x 和 y 的值。

指针与数组

在 C 语言中,指针和数组有着密切的联系。

数组名作为指针

在 C 语言里,数组名在大多数表达式中会被隐式转换为指向数组首元素的指针。也就是说,数组名代表了数组首元素的地址。
示例代码:

#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5};// 打印数组首元素的地址printf("数组首元素的地址(使用&arr[0]): %p\n", &arr[0]);// 打印数组名代表的地址printf("数组名代表的地址: %p\n", arr);return 0;
}

在上述代码中,&arr[0] 是获取数组 arr 首元素的地址,而 arr 本身在这个表达式中也被解释为指向数组首元素的指针,所以它们的值是相同的。

通过指针访问数组元素

由于数组名可以当作指针使用,因此可以借助指针来访问数组中的元素。
示例代码:

#include <stdio.h>int main() {int arr[5] = {1, 2, 3, 4, 5};int *p = arr;  // 指针p指向数组arr的首元素for (int i = 0; i < 5; i++) {// 通过指针访问数组元素printf("arr[%d] = %d\n", i, *(p + i));}return 0;
}
    <

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/29626.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于tomcat使用中浏览器打开index.jsp后中文显示不正常是乱码,但英文正常的问题

如果是jsp文件就在首行加 “<% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8" %>” 如果是html文件 在head标签加入&#xff1a; <meta charset"UTF-8"> 以jsp为例子&#xff0c;我们…

谐振开关型零电流开关变换器原理及仿真

以Buck DC/DC变换器为例&#xff0c;介绍零电流关断ZCS PWM变换器和零电流关断ZCS PFM变换器工作原理&#xff0c;及simulink仿真结果。 零电流关断脉冲宽度调制ZCS PWM变换器工作原理 下图是Buck DC/DC ZCS PWM变换器的主电路图&#xff0c;它由输入电源Vd、主开关管T1&…

RESTful API 设计指南

RESTful API 介绍 大佬的总结&#xff1a;RESTful API 设计指南 - 阮一峰的网络日志 json-server github地址 这里介绍一个快速搭建 REST API 服务的工具包 接口测试工具 介绍几个接口测试工具 apipost apifox postman https://www.apipost.cn/ (中文) https://www.apifox…

Dify部署踩坑指南(Windows+Mac)

组件说明 Dify踩坑及解决方案 ⚠️ 除了修改镜像版本&#xff0c;nginx端口不要直接修改docker-compose.yaml &#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 1、更换镜像版本 这个文件是由.env自动生成的&#xff0c;在.env配置 …

C++:string容器(上篇)

1. 标准库中的string类 1.1 string类 官方链接&#xff1a;string - C Reference (cplusplus.com) 在使用string类时&#xff0c;必须包含#include头文件以及using namespace std; 1.2 auto和范围for auto关键字&#xff1a; 在早期C/C中auto的含义是&#xff1a;使用auto修…

鸿蒙生态日日新,夸克、顺丰速运、驾校一点通等多款应用功能更新

3月5日鸿蒙生态日日新PLOG&#xff1a;吉事办、健康甘肃等政务服务App上架原生鸿蒙应用市场&#xff1b;夸克、顺丰速运、驾校一点通等多款应用功能更新。

QT 作业 C++ day5

作业 代码 MyQThread.h class MyThread : public QThread {Q_OBJECT public:MyThread(QObject *parent nullptr); protected:void run() override; signals://向ui界面发送的 "复制进度" 的信号void copy_process_signal(int index); public slots:// "复…

BOOK推荐-学海无涯

一、战略思维与商业洞察 《好战略,坏战略》(理查德鲁梅尔特) 重点:破除模糊口号,聚焦“诊断问题-制定方针-连贯行动”的战略核心逻辑。 《竞争战略》(迈克尔波特) 重点:五力模型、三大通用战略,掌握行业分析的底层框架。 《蓝海战略》(W.钱金 / 勒妮莫博涅) 重点:跳…

软件工程笔记下

从程序到软件☆ 章节 知识点 概论☆ 软件的定义&#xff0c;特点&#xff0c;生存周期。软件工程的概论。软件危机。 1.☆软件&#xff1a;软件程序数据文档 &#xff08;1&#xff09;软件&#xff1a;是指在计算机系统的支持下&#xff0c;能够完成特定功能与性能的包括…

python-leetcode-解决智力问题

2140. 解决智力问题 - 力扣&#xff08;LeetCode&#xff09; 这道题是一个典型的 动态规划&#xff08;Dynamic Programming, DP&#xff09; 问题&#xff0c;可以使用 自底向上 的方式解决。 思路 定义状态&#xff1a; 设 dp[i] 表示从第 i 题开始&#xff0c;能获得的最高…

Spring Boot集成Minio笔记

一、首先配置MinIO 1、MinIO新建Bucket&#xff0c;访问控制台如图 创建访问密钥(就是账号和密码) 二、集成mino添加Minio客户端依赖 1.maven构建方式在pom.xml引入jar <dependency><groupId>io.minio</groupId><artifactId>minio</artifactI…

TypeError: Cannot set properties of undefined (setting ‘xxx‘)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

第三次CCF-CSP认证(含C++源码)

第三次CCF-CSP认证 第一道&#xff08;easy&#xff09;思路及AC代码solution 1&#xff08;模拟&#xff09;solution 2 (哈希表) 第二道&#xff08;easy but mid for me&#xff09;思路及AC代码solution 1遇到的问题 solution 2 第三题&#xff08;mid&#xff09;基本思路…

常见排序算法鉴赏(原理剖析+动图演示)

目录 一、冒泡排序&#xff08;BubbleSort&#xff09; 二、选择排序&#xff08; SelectSort&#xff09; 三、插入排序&#xff08;InsertSort&#xff09; 四、希尔排序&#xff08;ShellSort&#xff09; 五、堆排序 六、快排&#xff08;QuickSort&#xff09; Hoa…

鸿蒙跨平台框架ArkUI-X

01 引言 目前&#xff0c;移动端主流跨平台方案有Flutter、React Native、uni-app等等&#xff0c;还有刚推出不久的Compose-Multiplatform&#xff0c;真所谓是百花齐放。这些框架各有特点&#xff0c;技术实现各有差异&#xff0c;比如Flutter通过Dart编写的UI描述对接Flutte…

【科一】综合素质

职业理念&职业道德 &#xff08;职业理念中的教育观&#xff09; 提速个性创两全 素质教育是 以提高国民素质为根本宗旨促进学生个性发展以培养学生的创新精神和实践能力为重点面向全体学生促进学生全面发展 学习过人 教育者为中心 转向学习者为中心教会学生知识 转向 教会…

一招解决Pytorch GPU版本安装慢的问题

Pytorch是一个流行的深度学习框架&#xff0c;广泛应用于计算机视觉、自然语言处理等领域。安装Pytorch GPU版本可以充分利用GPU的并行计算能力&#xff0c;加速模型的训练和推理过程。接下来&#xff0c;我们将详细介绍如何在Windows操作系统上安装Pytorch GPU版本。 查看是否…

静态时序分析:SDC约束命令set_ideal_network详解

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 set_ideal_network命令可以将当前设计中的一组端口或引脚标记为理想网络源&#xff08;或者说设置端口或引脚的ideal_network_source属性为true&#xff09;&…

优先队列priority_queue应用

不讲概念&#xff01;&#xff01;只说用法&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 优先队列 priority_queue 换种话来说就是堆&#xff0c;只可以从中取到最大或者最小的值&#xff0c;所以说&#xff0c;只维护堆顶。它使用less&#xff08;&#xff…

鸿蒙Android4个脚有脚线

效果 min:number122max:number150Row(){Stack(){// 底Text().border({width:2,color:$r(app.color.yellow)}).height(this.max).aspectRatio(1)// 长Text().backgroundColor($r(app.color.white)).height(this.max).width(this.min)// 宽Text().backgroundColor($r(app.color.w…