C语言 —— 指针(4)

动态内存分配

动态内存需要手动申请,手动归还,其内存是开辟在堆区。

申请的函数为:

void *malloc(size_t  size) (需包含头文件#include<stdlib.h>)

size:要分配的内存大小,以字节为单位。申请的空间是连续的,成功时返回指向内存分配的指针(类型为void * 型,通常需要进行强制类型转换),失败时返回空指针(NULL)。需手动管理内存,所分配的内存不会自动释放,必须调用free()避免内存泄漏。返回的指针会适当对齐,适合任何数据类型。如:分配一个整型数组

#include<stdio.h>
#include<stdlib.h>int main(void)
{int n = 5;int *a = (int *)malloc(n * sizeof(int));if(a == NULL){printf("分配内存失败\n");return 1;}int i = 0;for(i = 0; i < n; ++i){a[i] = i + 1;    }for(i = 0; i < n; ++i){printf("%d\n",a[i])}free(a);a = NULL;return 0;
}

释放内存后未将指针置为NULL称为悬空指针,可能导致非法访问。

动态内存重新分配

形式:void *relloc(void *p,size_t  newsize);

参数p:指向之前分配的内存的指针

参数size:所需要新的内存大小

返回值指向新的内存,与原来的p指向的内存可能不同。

特点:数据保留,拷贝原来的内容到新的空间。

eg:如原来申请内存只能容纳长度为10的一维整型数组,现在改为可容纳长度为20的一维整形数组。

void printArray(int *a,int len)
{int i;for(i < 0 ;i < len;++i){printf("%2d ",*(a + i));}puts("");
}int main(void)
{int n = 10;int *p = malloc(n * sizeof(int));int i;for( i = 0;i < n;++i){*(p + i) = i + 1;}int m = 20;int *q = realloc(p, m * sizeof(int));p = q;for(i = 10;i < m; ++i){*(p + i) = i + 1;}free(p);p = q = NULL;printArray(p,m);return 0;
}

函数指针

它存储的是函数的地址,而不是数据变量的地址。通过函数指针,可以动态的调用不同的函数,实现回调。

基本语法:

定义函数

int add(int a,int b)
{return a + b
}int sub(int a,int b)
{return a - b;
}

1、定义函数指针:  返回值类型(*指针变量名)(参数列表)

如回调上述代码:int (*pfn)(int , int);

2、初始化指针

pfn = &add;
或
pfn = add;

(函数名本身代表函数的入口地址)

即:

int add(int a,int b)
{return a + b
}int sub(int a,int b)
{return a - b;
}int(*pfn)(int,int) = add;

指针便指向了add函数(改为sub,便指向sub)

3、通过函数指针调用函数

int div3(int n)
{return n % 3 == 0;
}int div5(int n)
{return n % 5 == 0;
}int fn(int n)
{return 1;
}void printArray(int *a,int len,int(*pfn)(int))
{int i;for(i = 0;i < len; ++i){if(pfn(*(a + i))){printf("%2d ",*(a + i));}}puts("");}

主函数调用printArray传参,最后一个传入回调函数的函数名。

指针数组

指针数组是指一个数组,其元素都是指针,简单地说,数组中的每一个元素存储都是一个内存地址,而不是直接存储数据。

当它作为函数参数,形参是指向指针的指针。

void printStrings(char **p,int len)
{int i;for(i = 0;i < len;++i){puts(p[i]);}
}void reverseStrings(char **p,int len)
{int i;for(i = 0;i < len / 2;++i){char *t;t = p[i];p[i] = p[len - i - 1];p[len - i - 1] = t;}
}char *maxStrings(char **p,int len)
{char *max = p[0];int i;for(i = 1;i < len; ++i){if(strcmp(max,p[i]) < 0){max = p[i];}}return max;
}void sortStrings(char **p,int len)
{int i,j;for(i = 0; i < len - 1;++i){for(j = i + 1;j < len; ++j){if(strcmp(p[i] , p[j]) > 0){char *t;t = p[i];p[i] = p[j];p[j] = t;}}}
}int main(void)
{char *s[3] = {"Hello","World!","China"};int len = sizeof(s) / sizeof(*s);//reverseStrings(s,len);//printStrings(s,len);//printf("%s\n",maxStrings(s,len));sortStrings(s,len);printStrings(s,len);return 0;
}

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

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

相关文章

常用算法思想及模板

今天继续整理一些关于算法竞赛中C适用的一些模板以及思想。 保留x位小数 保留x位小数在C语言中可以使用printf中的"%.xf"来实现&#xff0c;但是很多C选手由于关闭了同步流&#xff0c;害怕cin、cout与scanf、printf混用容易出错&#xff0c;所以就给大家介绍一个强…

GitLab 仓库 — 常用的 git 命令

在公司的 gitlab 公共仓库中写代码做项目时&#xff0c;主要涉及以下常用 git 命令&#xff1a;一、单个命令讲解1. 拉取代码&#xff08;1&#xff09;git clone [仓库 URL]‌克隆远程仓库到本地&#xff08;需确保 URL 正确&#xff09; ‌&#xff08;‌2&#xff09;git pu…

【28】C# WinForm入门到精通 ——多文档窗体MDI【属性、方法、实例、源码】【多窗口重叠、水平平铺、垂直平铺、窗体传值】

文章目录1多文档窗体MDI2 基本设置3 实例&#xff1a;多窗口重叠、水平平铺、垂直平铺3.1 主窗口属性设置3.2 主窗口3.3 主窗口窗口添加MenuStrip菜单3.4 添加处理函数3.5 测试效果4 利用窗体参数定义进行传值4.1 在Form2、Form3添加相关控件4.2 Form3 定义函数public Form3(st…

【计算机科学与应用】基于Session欺骗攻击的Web应用程序防护

导读&#xff1a; 本文对Web应用程序开发中的Session欺骗攻击进行了阐述&#xff0c;详细讲解了防范Session欺骗攻击的三种传统方法&#xff0c;并给出了防范代码&#xff0c;分析了三种传统防范方法的不足&#xff0c;新设计了一种通过Referer信息验证来加强对Session欺骗的防…

yolo8+阿里千问图片理解(华为简易版小艺看世界)

✅ 实现目标 按下空格键 → 获取摄像头当前画面&#xff1b; 将图片上传给 大模型 接口&#xff0c;让其“看图说话”&#xff1b; 获取返回描述后&#xff0c;以字幕形式展示在图像画面上&#xff1b; 持续显示识别结果&#xff0c;直到下次按空格。 &#x1f9e0; 需要准…

【ee类保研面试】数学类---线性代数

25保研er&#xff0c;希望将自己的面试复习分享出来&#xff0c;供大家参考 part0—英语类 part1—通信类 part2—信号类 part3—高数类 part100—self项目准备 文章目录线性代数知识点大全**1. 余子式与代数余子式****2. 行列式的含义****3. 矩阵的秩&#xff08;Rank&#xf…

在 Scintilla 中为 Squirrel 语言设置语法解析器的方法

Scintilla 作为一个强大的开源文本编辑控件&#xff0c;通过配置语法解析器&#xff0c;能够对多种编程语言实现语法高亮、代码折叠等实用功能。若要为新语言 Squirrel 设置语法解析器&#xff0c;可参考以下步骤&#xff1a;​创建 Lexer 源文件&#xff1a;Scintilla 通过 Le…

Go语言核心知识点补充

Go语言核心知识点补充 make函数、for循环与输入处理详解 在前几章的内容中&#xff0c;我们介绍了Go语言的基础语法、变量声明、切片、循环等核心概念。但在实际开发中&#xff0c;一些细节性的知识点往往决定了代码的健壮性与效率。 本文将针对前几章涉及到的变量声明与初始化…

AI服务器中,EEPROM有哪些部件使用,需要存储哪些信息?

在AI服务器中&#xff0c;EEPROM&#xff08;电可擦可编程只读存储器&#xff09;主要用于存储关键组件的配置数据、身份信息和校准参数。以下是主要组件及其存储内容&#xff1a; 一、核心组件及存储数据主板&#xff08;Baseboard Management Controller, BMC&#xff09; FR…

It学习资源下载

一.UI 8个高质量UI设计网站&#xff0c;灵感收集必备&#xff01;

Docker Compose :从入门到企业级部署

Docker Compose &#xff1a;从入门到企业级部署1. Docker Compose 核心概念1.1 Compose 架构全景图2. 完整开发工作流2.1 典型开发流程2.2 多服务示例项目结构3. 核心配置详解3.1 服务配置矩阵3.2 网络拓扑示例4. 企业级部署方案4.1 多环境配置管理4.2 扩展部署架构5. 高级技巧…

1.2.vue插值表达式

在 Vue.js 中&#xff0c;插值表达式是用于在模板中显示数据的一种方式。它使用双大括号语法 {{ }} 来包裹需要输出的变量或表达式的值。Vue 会自动将这些表达式的值插入到 HTML 文档中相应的位置。插值表达式基本用法最基本的插值表达式形式就是直接在模板中引用 Vue 实例中的…

Python数据处理基础(学习笔记分享)

Python数据处理入门 常用库学习 numpy NumPy&#xff08;Numerical Python&#xff09; 是 Python 中用于高效数值计算的库&#xff0c;核心是提供一个强大的 ndarray​&#xff08;多维数组&#xff09;对象&#xff0c;类似于 C/C 中的数组&#xff0c;但支持更丰富的操作&a…

力扣面试150题--颠倒二进制位

Day 89 题目描述思路 二进制的算法&#xff0c;将十进制转化为二进制&#xff0c;有一点需要注意&#xff0c;直接采取库函数转化为二进制再反转会出现问题&#xff08;这也是为什么我要补0的原因&#xff09;&#xff0c;因为转化过去不满足32位的二进制&#xff0c;前面不会当…

【ResNet50图像分类部署至RK3588】模型训练→转换RKNN→开发板部署

已在GitHub开源与本博客同步的ResNet50v2_RK3588_Classificationt项目&#xff0c;地址&#xff1a;https://github.com/A7bert777/ResNet50v2_RK3588_Classification 详细使用教程&#xff0c;可参考README.md或参考本博客第八章 模型部署 文章目录一、项目回顾二、模型选择介…

C# _泛型

目录 泛型是什么? 泛型的主要优势 创建一个泛型类 泛型方法 泛型是什么? 泛型是通过参数化来实现同一份代码上操作多种数据类型 利用参数类型将参数的类型抽象化 从而实现灵活的复用 总结: 通过泛型可以实现在同一份代码上操作多种数据类型的逻辑 将类和类中的成员定义…

Vue路由钩子完全指南

Vue.js中的路由导航钩子&#xff08;Navigation Guards&#xff09;主要用于在路由导航过程中进行拦截和处理&#xff0c;确保访问控制和状态管理。以下是主要分类及使用方法&#xff1a; 1. 全局钩子函数 作用于整个路由实例&#xff0c;需在路由配置外定义&#xff1a; befor…

RAGFlow 登录界面点击登录无反应,控制台报错 502 Bad Gateway 解决方法

遇到的问题 在使用RAGFlow的时候&#xff0c;登录不进去&#xff0c;但是之前能登录。 还出现了输入地址直接进入工作界面&#xff0c;但是进行不了任何操作的bug&#xff1b;以及无法上传文档的问题&#xff08;其实都是因为没登录&#xff09;。 登陆界面报错如图显示。 …

数据结构第3问:什么是线性表?

线性表 线性表由具有相同数据类型的n个元素构成&#xff0c;这些元素之间存在一一对应的线性关系。其中n为表长&#xff0c;当n0的时候线性表是一个空表。简单来说&#xff0c;线性表中的元素排列成一条线&#xff0c;每个元素最多有一个直接的前驱和后继&#xff08;除第一个和…

常见CMS 靶场复现

一、wordpass1.修改模版文件getshell搭建网站登录网站后台更改网站模版的相关文件写入一句话木马凭借路径访问/wp-content/themes/twentyfifteen/404.php/?aphpinfo();2.上传夹带木马的主题getshell外观-->主题-->添加-->上传-->浏览-->安装-->访问木马文件…