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

C语言:指针4(常量指针和指针常量及动态内存分配)

常量指针与指针常量

常量:分为字面量和只读常量,字面量就是我们平时直接操作的量:

printf("%d\n",12);/printf("%s\n","hello");只读常量使用关键字 const 修饰,凡是被这个关键字修饰 的变量,一旦赋值,值就不能改变。

语法:

// 字面量
printf("%d\n",12);
// 只读常量
const int a = 10;
a = 21;// 编译错误,因为此时这个变量是只读常量,所以不可更改其值

常量指针

定义:常量的指针,本质是一个指针,指针指向的数据不能改变。
定义格式:

const 数据类型 *变量名;

举例:

const int *p;// p就是常量指针

结论

1. 常量指针指向的数据不能被改变(不能解引用间接修改数据)

2. 常量指针的地址可以改变(指向是可以改变)。

应用场景:作为形式参数,实际参数需要给一个常量。

void foreach(const int *array,const int len){..}

案例:

#include <stdio.h>
int main(int argc,char *argv[])
{// 定义变量int a = 10;// 定义常量指针const int *p = &a;//*p = 100;// 编译报错,常量的值不能被改变printf("%d\n",*p);// 10// 定义变量int b = 20;p = &b;    // 编译通过,常量的地址可以被改变printf("%d\n",*p);// 20return 0;
}

指针常量

定义:指针的常量,指针的指向不能改变

定义格式:

数据类型* const 变量名;

举例:

int* const p;// 指针常量

结论:

1. 指针常量的指向不能改变(不能给指针变量重新赋地址值)

2. 指针常量的指向的数据可以改变。

注意:指针常量在定义时就要赋值;不能先定义后赋值,否则编译报错

案例:

#include <stdio.h>
int main(int argc,char *argv[])
{// 定义变量int a = 10;// 定义指针常量int* const p = &a;*p = 100;// 编译通过,常量的值可以被改变printf("%d\n",*p);// 100// 定义变量int b = 20;//p = &b;   // 编译报错,常量的地址不可被改变printf("%d\n",*p);// 100return 0;
}

常量指针常量

定义语法:

const 数据类型* const 变量名;

举例:

const int* const p;

作用:p的指向不能被改变(地址不可更改),p指向的数据不能改变(地址对应的数据不可更改)

动态内存分配

我们要想实现动态内存分配,就需要学习标准C提供的函数库(API):
1. 函数所属的库文件
2. 函数的原型-函数的声明
        函数名
        形参
        返回值类型
3. 函数功能
注意:内存分配函数在申请内存时,建议用多少申请多少,可以有少量的预留量;但不能越界访问
(虽然编译和运行不报错,但是数据不安全(野指针))

常用函数

malloc

头文件: #include <stdlib.h>
函数功能:C库函数 void* malloc(size_t size); 分配所需的内容空间,并返回一个指向它的
指针。
函数原型:
函数名:malloc
形式参数:size_t size:需要申请的内存块的大小,以字节为单位。本质上是一个 unsigned
long int

返回值类型:void*(万能指针):该函数返回一个指针,指向已分配大小的内存,如果请
求失败,返回NULL(0x000000000000对应的一块不可访问的区域)
举例:

int* p = (int*)malloc(sizeof(int));
// 清零,这里不是释放内存,只是将内存中的随机值清理掉
bzero(p,sizeof(int));
// 使用空间...
// 释放空间
free(p);

说明:
malloc函数分配的内存没有默认值,内存中的数据是随机值(大概率是0),使用前需要借
助于bzero()清零。
malloc函数申请的内存空间连续

calloc

头文件: #include <stdlib.h>
函数功能:C库函数 void* calloc(size_t nitems,size_t size) 分配所需的内存空间,并返回
一个指向它的指针。
malloc和calloc之间的区别:malloc不会设置内存为零,需要使用bzero()清零,而calloc会设置内
存为零。
函数原型:
函数名:calloc
形式参数:
size_t nitems:申请多少个
size_t size:一个占几个内存单元(1个内存单元=1个字节)
返回值类型:void*:该函数返回一个指针,指向已分配大小的内存,如果请求失败,返回
NULL

举例:

int *p = (int*)calloc(1,sizeof(int));  
// 使用空间...
// 释放空间
free(p);

说明:
calloc函数分配的内存有默认值,每个内存单元都是0
calloc函数申请的内存空间连续
calloc大多时候为数组中的元素申请内存
案例:

#include <stdio.h>
#include <stdlib.h>
/*** 需求:转存栈中数组中的数据*/ 
int main(int argc,char *argv[])
{// 在栈区创建一个数组int arr[3] = {11,22,33};// 在堆区申请内存int *p = (int*)calloc(3,sizeof(int));// 转存for(int i = 0; i < 3; i++)p[i] = arr[i];// 遍历堆中数据for(int i = 0; i < 3; i++)printf("%-4d",p[i]);printf("\n");// 在堆中申请空间,使用完毕一定要记得释放free(p);p = NULL;printf("p=%p\n",p);return 0;
}

realloc

头文件: #include <stdlib.h>
函数功能:尝试重新调整之前调用malloc或calloc所分配的ptr所指向的内存块的大小。
函数原型: void *realloc(void *ptr,size_t size)
函数名:realloc
形式参数:
void *ptr:是malloc或者calloc的返回值
size_t size:重新分配后的内存大小
返回值:void*:该函数返回一个指针,指向已分配大小的内存。如果请求失败,返回
NULL。
案例:

 int *p = (int*)malloc(4);int *w = (int*)realloc(p,20);// int *q = (int*)realloc(p,0); // 等效于free(p)

说明:
1. realloc以原来malloc返回的内存地址开始,分配总共20个字节的内存空间
2. 如果原来的内存空间后有20个连续空间,就扩容20-4 =16个内存单元,返回原来旧的内存首
地址。

3. 如果原来的内存空间后不够20个连续内存空间,就重新找一个内存地址开始,申请20个内
存单元。并将原来的数据拷贝到新的内存中,回收旧的内存单元,并返回新的内存首地址。

free

头文件: #include <stdlib.h>
函数功能:释放之前调用 malloc、calloc、realloc所分配的内存空间,是访问完记得使用NULL
置空。
函数原型: void free(void *ptr)
函数名:free
形式参数:
void *ptr:calloc,malloc.realloc的返回值
返回值类型:void:没有返回值
注意:
1. 堆内存中的指针才需要回收,栈中系统会自动回收
2. 堆内存不能重复回收,运行会报错
说明:
1. 堆的内存空间相比较栈要大很多
2. 内存分配函数返回的指针变量可以参与运算(只读),但不能被修改(p++或者p+=i 是错误
的)

相关文章:

C语言:指针4(常量指针和指针常量及动态内存分配)

常量指针与指针常量 常量&#xff1a;分为字面量和只读常量&#xff0c;字面量就是我们平时直接操作的量&#xff1a; printf("%d\n",12);/printf("%s\n","hello");只读常量使用关键字 const 修饰&#xff0c;凡是被这个关键字修饰 的变量&…...

Win11提示fveapi.dll丢失是什么原因?fveapi.dll丢失怎么办?

一、fveapi.dll丢失的成因与影响 成因&#xff1a; 系统更新不完整&#xff1a;Win11系统在更新过程中&#xff0c;如果某个环节出现问题&#xff0c;可能会导致fveapi.dll等系统文件未能正确更新或安装。软件冲突&#xff1a;某些第三方软件可能与系统文件发生冲突&#xff…...

台球助教平台系统开发APP和小程序信息收藏功能需求解析(第十二章)

以下是开发台球助教系统客户端&#xff08;APP&#xff0c;小程序&#xff0c;H5&#xff09;几端的信息收藏功能的详细需求和功能说明&#xff0c;内容比较详细&#xff0c;可以说是一个教科书式的详细说明了&#xff0c;这套需求说明不仅仅用在我们的台球助教系统程序上&…...

如何设计 Vue 3 组件库:高效的组件化开发方法

如何设计 Vue 3 组件库&#xff1a;高效的组件化开发方法 &#x1f4d6; 前言 随着前端技术的不断发展&#xff0c;Vue.js 已成为现代化 Web 应用开发的主流框架之一。Vue 3 引入了诸多改进&#xff0c;尤其是组合式 API&#xff0c;使得 Vue 在开发大型项目时&#xff0c;能够…...

第八节、Bresenham直线插补运动【51单片机-L298N-步进电机教程】

摘要&#xff1a;前面章节主要介绍单个电机控制&#xff0c;本节内容介绍两个电机完成直线插补运动 一、 Bresenham直线算法介绍 Bresenham直线算法由Jack Elton Bresenham于1962年在IBM开发&#xff0c;最初用于计算机显示直线&#xff0c;它确定应该选择的n维光栅的点&#…...

一个从oracle使用spool导出数据到kadb的脚本

1. dump_data.sh调用sql_dump.sh导出数据 2. load_data.sh将导出的数据加载至KADB 1. dump_data.sh #!/bin/bash begin_time$(date %Y%m%d -d -1 day) end_time$(date %Y%m%d) echo "数据导出日期:"$begin_time echo "数据导出日期:"$begin_time >>…...

【STM32】GPIO口以及EXTI外部中断

个人主页~ 有关结构体的知识在这~ 有关枚举的知识在这~ GPIO口以及EXTI外部中断 GPIO一、简介二、基本结构三、输入输出模式1、输入模式&#xff08;1&#xff09;上拉输入&#xff08;2&#xff09;下拉输入&#xff08;3&#xff09;浮空输入&#xff08;4&#xff09;模拟输…...

Confluent Cloud Kafka 可观测性最佳实践

Confluent Cloud 介绍 Confluent Cloud 是一个完全托管的 Apache Kafka 服务&#xff0c;提供高可用性和可扩展性&#xff0c;旨在简化数据流处理和实时数据集成。用户可以轻松创建和管理 Kafka 集群&#xff0c;而无需担心基础设施的维护和管理。Confluent Cloud 支持多种数据…...

【LeetCode每日一题】——415.字符串相加

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 字符串 二【题目难度】 简单 三【题目编号】 415.字符串相加 四【题目描述】 给定两个字符…...

linux---使用定时任务同步时间

首先&#xff0c;确保你的系统上安装了ntpdate工具&#xff0c;它用于从NTP服务器获取并设置系统时间。如果你的系统上没有安装&#xff0c;你可以通过包管理器进行安装 安装ntpdate yum install -y ntpdate设置定时任务 crontab -e在文件中添加下面内容 #每5分钟同步一次时间 …...

Windows、CentOS环境下搭建自己的版本管理资料库:GitBlit

可以搭建属于公司内部或者个人的Git服务器&#xff0c;方便程序代码及文档版本管理。 官网&#xff1a;http://www.gitblit.com/ Windows环境下安装 提前已经安装好了JDK。 官网下载Windows版的GitBlit。 将zip包解压到自己想要放置的文件夹下。 建立版本库路径&#xff0c…...

KNN分类算法 HNUST【数据分析技术】(2025)

1.理论知识 KNN&#xff08;K-Nearest Neighbor&#xff09;算法是机器学习算法中最基础、最简单的算法之一。它既能用于分类&#xff0c;也能用于回归。KNN通过测量不同特征值之间的距离来进行分类。 KNN算法的思想&#xff1a; 对于任意n维输入向量&#xff0c;分别对应于特征…...

AI Agent开源框架汇总(持续更新)

文章目录 AI Agent开源框架汇总什么是AI Agent为什么需要智能体(Agent)Web3 AI Agent使用场景框架分类低代码(No-Code/Low-Code)框架基础框架代码框架Multi-Agent 框架 / 架构热门开源框架PhidataRigai16z的AI Agent框架ElizaLangChain和phidata对比OpenAI SwarmAI Agent开…...

录播检测原理是什么?

直播间录播的检测可以通过多种方式进行。以下是一些常见的检测方法&#xff1a; 1、水印识别&#xff1a;直播平台可以在实时直播画面中嵌入特定的水印&#xff0c;通过识别水印来判断是否存在录播行为。 2、特征分析:直播平台可以通过对直播画面进行特征分析&#xff0c;检测…...

IndexOf Apache Web For Liunx索引服务器部署及应用

Apache HTTP Server 是一款广泛使用的开源网页服务器软件,它支持多种协议,包括 HTTP、HTTPS、FTP 等 IndexOf 功能通常指的是在一个目录中自动生成一个索引页面的能力,这个页面会列出该目录下所有的文件和子目录。比如网上经常看到的下图展现的效果,那么接下来我们就讲一下…...

MySQL索引为什么是B+树

MySQL索引为什么是B树 索引是帮助MySQL高效获取数据的数据结构&#xff0c;在数据之外&#xff0c;数据库还维护着满足特定查找算法的数据结构B树&#xff0c;这些数据结果以某种特定的方式引用数据&#xff0c;这样就可以在这些数据结构上实现高级查找算法&#xff0c;提升数据…...

ffmpeg之播放一个yuv视频

播放YUV视频的步骤 初始化SDL库&#xff1a; 目的&#xff1a;确保SDL库正确初始化&#xff0c;以便可以使用其窗口、渲染和事件处理功能。操作&#xff1a;调用 SDL_Init(SDL_INIT_VIDEO) 来初始化SDL的视频子系统。 创建窗口用于显示YUV视频&#xff1a; 目的&#xff1a;…...

《2023-2024网络安全产业发展核心洞察与趋势预测》

2023年至2024年间&#xff0c;我国经济总体上逐步显现出复苏迹象&#xff0c;并开始释放向上增长的潜力。在此背景下&#xff0c;网络安全产业也经历了经济环境的深刻影响&#xff0c;不仅实现了阶段性的稳定发展&#xff0c;也展现出较强的韧性与适应能力&#xff0c;为未来的…...

为什么环境影响评价导则中生态环境评价中的【植被类型图】制作比较难?制作流程是什么

最新《环境影响评价技术导则生态影响HJ19—2022》于2022年1月15日发布&#xff0c;2022-07-01正式实施&#xff0c;新导则颁布后&#xff0c;要求生态现状评价内容中基本图件构成包含&#xff1a;项目区域地理位置图、工程平面图、调查样方、样线、点位、断面等布设图、土地利用…...

肿瘤电场治疗费用

肿瘤电场治疗作为一种前沿的肿瘤治疗方法&#xff0c;近年来备受关注。该方法通过利用特定频率的交流电场&#xff0c;作用于恶性肿瘤细胞&#xff0c;以达到抑制肿瘤生长的目的。然而&#xff0c;随着这种治疗方法的普及&#xff0c;其费用问题也逐渐成为患者和家属关注的焦点…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...