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

DAY15-指针(3)

1.动态内存分配

(1)函数的基本用法

malloc(空间大小)           申请内存空间

 eg:

int a[] = {1,2,3,4,5,6,7,8,9,0};
int *p;
p = malloc(sizeof(a));

free (void *p)                   释放空间

注意事项:

①free (NULL)                     不会报错

②不能销毁两次相同的指针

③不能进行++运算

eg:

int a[] = {1,2,3,4,5,6,7,8,9,0};
int *p;
p = malloc(sizeof(a));free(q);

realloc (void *p,空间大小)                    重新分配内存空间,并且释放之前的空间

 eg:

int a[] = {1,2,3,4,5,6,7,8,9,0};
int *p;
p = malloc(sizeof(a));int b[] = {10,11,12,13,14,15};p=realloc(p, sizeof(a) + sizeof(b));free(q);

(2)例题

void printArray(int *s, int len)
{int i;for(i = 0;i < len;++i){printf("%d\n",*(s + i));}
}
int main(void)
{int n = 10;int *p = calloc(n, sizeof(int));int i;for(i = 0;i < n;++i){*(p + i) = i + 1;}printArray(p, n);p = realloc(p, n * 2 * sizeof(int));for(i = n;i < n * 2;++i){*(p + i) = i + 1;}printArray(p, n * 2);free(p);p = NULL;return 0;}

2.函数指针

(1)一般形式

数据类型 (*指针变量名)(函数参数列表)

eg:

int (*p)(int, int)

说明:

int (*p)(int int)        表示定义一个指向函数的指针变量p,它不是固定指向哪一个函数的,而只是表示定义了这样一个类型的变量,它是专门用来存放函数的入口地址的。 

(*p)的()不能被省略

 (2)赋值

在给函数指针变量赋值时,只需给出函数名而不必给出参数。

eg: 

p = max;

(3)调用 

用函数指针变量调用函数时,只需将(*p)代替函数名即可,在(*p)之后的括号中根据需要写上实参。

eg:

c = (*p)(a, b);c = p(a, b);                       

 注:两种写法都可以,一般用第二种写法。

(4)例题

遍历数组里面能被5整除的数

#include <stdio.h>int div3(int n)
{return n % 3 == 0;
}int div5(int n)
{return n % 5 == 0;
}void printArray(int *a, int len, int (*pfn)(int))
{int i;for(i = 0;i < len;++i){if(pfn(a[i])){printf("%d\n", a[i]);}}
}int main(void)
{int a[] = {1,-2,3,-4,5,-6,7.-8,9,0};int len = sizeof(a) / sizeof(*a);printArray(a, len, div5);return 0;
}

3.指向指针的指针

(1)一般形式

char **p;p = &q;

*p是说明p是一个指针,char *是它的基类型。

4.指针数组

(1)一般形式

类型名 *数组名[数组长度]

eg:

int *p[4];

(2)指针数组作为函数参数

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

(3)例题 

 eg1:找最大的字符串

#include <stdio.h>
#include <string.h>char *maxStrings(char **p, int len)
{char *max = p[0];for(int i = 1;i < len;++i){if(strcmp(max,p[i]) < 0){max = p[i];}}return max;
}int main(void)
{char *s[3] = {"Hello", "World", "China"};int len = sizeof(s) / sizeof(*s);puts(maxStrings(s, len));return 0;
}

eg2:对字符串逆序

#include <stdio.h>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 = p[i];p[i] = p[len - i - 1];p[len - i - 1] = t;}
}int main(void)
{char *s[3] = {"Hello", "World", "China"};int len = sizeof(s) / sizeof(*s);reverseStrings(s, len);printStrings(s, len);return 0;
}

eg3:对字符串进行排序

#include <stdio.h>
#include <string.h>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 = p[i];p[i] = p[j];p[j] = t;}}}
}int main(void)
{char *s[3] = {"Hello", "World", "China"};int len = sizeof(s) / sizeof(*s);SortStrings(s, len);printStrings(s, len);return 0;
}

eg4:交换函数

void swapStrings(char **p1, char **p2)
{char *t = *p1;*p1 = *p2;*p2 = t;
}

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

相关文章:

  • 解决:React Native 中常见的 状态栏遮挡内容
  • python 中 TypeError: self类型对象传入错误解决办法
  • 在职申硕,怎么选适合自己的学科专业呢?
  • 计算机网络1-3:三种交换方式
  • sed编程入门
  • Android RTMP推送|轻量级RTSP服务同屏实践:屏幕+音频+录像全链路落地方案
  • 本地 docker 部署 HAR包分析工具 harviewer
  • 2025年7月技术问答第5期
  • MySQL: with as与with RECURSIVE如何混合使用?
  • 【算法】十大排序算法超深度解析,从数学原理到汇编级优化,涵盖 15个核心维度
  • 专题:2025机器人产业技术图谱与商业化指南|附130+份报告PDF、数据汇总下载
  • C++实战:抖音级视频应用开发精髓
  • LazyLLM教程 | 第2讲:10分钟上手一个最小可用RAG系统
  • [极客时间]LangChain 实战课 -----|(11) 记忆:通过Memory记住客户上次买花时的对话细节
  • macOS 设置 Claude Code
  • 02 NameServer是如何管理Broker集群的
  • 【STM32-HAL】 SPI通信与Flash数据写入实战
  • Elasticsearch(ES)基础语法(笔记)(持续更新)
  • MySQL索引和事务笔记
  • 如何通过项目管理系统提升交付率
  • Kafka 重复消费与 API 幂等消费解决方案
  • IO复用实现并发服务器
  • 【PZ7020-StarLite 入门级开发板】——FPGA 开发的理想起点,入门与工业场景的双重优选
  • 【工具】jsDelivr CDN完全指南:免费高速的开源项目CDN服务
  • Apache Ignite 与 Spring Boot 集成
  • Linux 进程管理与计划任务设置
  • 【Dv3admin】ORM数据库无法查询的问题
  • 如何修改VM虚拟机中的ip
  • opengauss数据库安装及测试
  • 【C语言】深度剖析指针(二):指针与数组,字符,函数的深度关联