C语言:一级指针,二级指针,三级指针,指针数组,数组指针的综合示例

2023-10-26

本博客主要介绍一级指针,二级指针,三级指针,指针数组和数组指针的综合应用示例。下面简单介绍指针数组和数组指针的区别:

指针数组:char *p[] = {"aaa","bbbb"};

                 定义了一个数组p,p中每一个元素都是一个指针。

数组指针: char (*p)[5];

定义了一个指针p,p指向一个长度为5的数组,即p使一个数组指针变量 。

本示例代码目的是:将两个内存块中值复制到另一个中并排序。

下面是示例代码:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

//下面有两种释放内存空间 的方法:
void free_merge_sort1(char **p, int num)
{
	int i = 0;
	if (p == NULL)
	{
		return;
	}
	for (;i<num; i++)
	{
		free(p[i]);
	}
	free(p);
}

void free_merge_sort2(char ***p, int num)
{
	int i = 0;
	char **tmp = NULL;
	if (p == NULL)
	{
		return;
	}

	tmp = *p;//还原成二级指针
	if (tmp == NULL)
	{
		return;
	}
	for (;i<num; i++)
	{
		free(tmp[i]);
	}
	free(tmp);

	*p = NULL;//间接赋值

}

int merge_sort(char **myp1, int num1, char (*myp2)[30],int num2, char ***myp3, int *num3)//函数调用参数有:二级指针,
																		//数组指针,三级指针和一级指针
{
	int ret = 0;
	int i= 0;
	int j = 0;
	int tmplen = 0;
	int num = 0;
	int k = 0;
	char *tmp = NULL;
	char **tmp3 = NULL;

	if (myp1 == NULL || myp2 == NULL)
	{
		ret = -1;
		printf("myp1 == NULL || myp2 == NULL : %d \n",ret);
		goto END;
	}

	num = num1 + num2;
	tmp3 = (char **)malloc(num * sizeof(char *));
	if (tmp3 == NULL)
	{
		ret = -2;
		goto END;
	}

	for (i=0; i<num1; i++)
	{
		tmplen = strlen(myp1[i]) + 1;
		tmp3[i] = (char *)malloc(tmplen * sizeof(char));
		if (tmp3[i] == NULL)
		{
			ret = -3;
			goto END;
		}
		strcpy(tmp3[i], myp1[i]);
	}

	for (j=0; j<num2; j++,i++)
	{
		tmplen = strlen(myp2[j]) + 1;
		tmp3[i] = (char *)malloc(tmplen * sizeof(char));
		if (tmp3[i] == NULL)
		{
			ret = -4;
			goto END;
		}
		strcpy(tmp3[i], myp2[j]);
	}
	for (k=0; k<num; k++)
	{
		for (j=k+1; j<num; j++)
		{
			if (strcmp(tmp3[k],tmp3[j]) > 0)
			{
				tmp = tmp3[k];
				tmp3[k] = tmp3[j];
				tmp3[j] = tmp;
			}
		}
	}

	*num3 = num;
	*myp3 = tmp3;//间接赋值

END:
	if (i != num)//如果判断成立,则中间有错误,需要释放申请的内存。这里巧妙的利用了i的变化来释放申请的内存
	{
		if (tmp3 != NULL)
		{
			free_merge_sort1(tmp3, i);//这里是i
		}
	}	
	return ret;
}

int main()
{
	int ret = 0;
	char *p1[] = {"aaaa","ddddddd","bbbbbb"};
	char buf2[10][30] = {"111111","444444","3333333"};
	char **p3 = NULL;
	int len1, len2, len3;
	int i = 0;

	len1 = sizeof(p1)/sizeof(*p1);
	len2 = 3;
	len3 = len1 + len2;

	ret = merge_sort(p1, len1, buf2, len2, &p3, &len3);
	if (ret != 0)
	{
		printf("func merge_sort err: %d",ret);
		return ret;
	}

	for (i=0; i<len3; i++)
	{
		printf("%s  ",p3[i]);
	}
	printf("\n");

	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言:一级指针,二级指针,三级指针,指针数组,数组指针的综合示例 的相关文章

随机推荐

  • Kettle8.2转换组件之排序与去除重复记录

    Kettle8 2转换组件之排序与去除重复记录 一 相关说明 二 设计转换 三 转换配置 四 运行转换 五 查看结果 一 相关说明 需求说明 从Excel读取数据 去除其中重复的字段 并把结果数据保存在数据库表中 排序记录组件说明 排序记录
  • 圆的碰撞检测

    bool CollisionBetweenCircles circle c1 circle c2 bool hit float distanceOfCenter sqrt pow c1 center x c2 center x 2 pow
  • Python基础入门笔记(一)

    前言 认识Python 既然学习 Python 那么至少得了解下这门语言 知道 Python 代码执行过程吧 Python 的历史有兴趣的百度百科下就有 这个不多说了 1 我们先来了解下什么是解释型语言和编译型语言 计算机是不能够识别高级语
  • 【毕业设计】 基于Stm32的家庭智能监控系统 - 单片机 图像识别 人体检测 AI

    0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目缺少创新和亮点 往往达不到毕业答辩的要求 这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求 为了大家能够顺利以及最少的精力通过毕设 学长分享优质毕业设计项
  • 【NSGA2三维路径规划】非主导排序遗传算法2求解无人机三维路径规划【含Matlab源码 1455期】

    一 无人机简介 0 引言 随着现代技术的发展 飞行器种类不断变多 应用也日趋专一化 完善化 如专门用作植保的大疆PS X625无人机 用作街景拍摄与监控巡察的宝鸡行翼航空科技的X8无人机 以及用作水下救援的白鲨MIX水下无人机等 决定飞行器
  • 获取当前时间点的毫秒值,对std::chrono类的简单小结

    C 11 std chrono主要类与函数总结 duration time point system clock duration cast f 先来看一段获取当前毫秒值的代码 我们根据这个代码进行拆分学习 include
  • windows 执行bat脚本

    bat脚本中运行另外一个bat脚本 call 命令 call1 bat内容如下 echo running call1 call2 bat内容如下 echo off echo start call call1 bat echo running
  • Ogre 界面(Overlay)

    Ogre 界面 Overlay 标签 border脚本buttontemplatesplugins引擎 2011 10 16 23 12 4725人阅读 评论 2 收藏 举报 分类 引擎技术 9 这里的界面是指菜单 HUD及提示信息框在内的
  • 各个join区别

    在数学中 笛卡尔乘积是指两个集合X和Y的笛卡尓积 Cartesian product 又称直积 表示为X Y 第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 假设集合A a b 集合B 0 1 2 则两个集合的笛卡尔积为
  • 基于MATLAB的几种图像分割算法

    最大类间方差法 基本思路是根据直方图以某一会灰度为阈值将图像分割成两部分 计算两组的方差 当被分成的两组之间的方差最大时 这个灰度为阈值灰度值 img imread C Users dell Desktop 前单图 3 3 JPG 原图 I
  • 最新版本Android-Studio2.1.2 Windows7 64bit系统下搭建Android开发环境

    windows7 64bit系统下搭建Android开发环境 最新版本Android Studio2 1 2 注 现在在使用i MX6Q开发板做嵌入式系统开发 跑的是Android系统 想在开发板写一些测试程序 因此搭建了Android开发
  • FreeRTOS 事件组

    实现功能 当任务A B完成后执行串口任务 不同任务用不同的位表示 configUSE 16 BIT TICKS 1 bitx 0 7 configUSE 16 BIT TICKS设置为0 bitx 0 23 串口任务的头文件 ifndef
  • QNX操作系统简介

    QNX是商业类Unix实时操作系统 主要针对嵌入式系统市场 该产品开发于20世纪80年代初 后来改名为QNX软件系统公司 QNX软件系统公司 黑莓公司旗下子公司 是全球领先的创新嵌入式技术供应商 包括中间件 开发工具和操作系统 QNX Ne
  • Django配置mysql数据库

    默认使用SQLite3数据库 1 本地已安装mysql数据库 或者使用已存在的数据库 创建表空间 存放项目中的表 create database bobmydata show databases 2 安装数据连接工具PyMySQL pip
  • eclipse中jsp自动提示慢的问题

    这几天用eclipse编写jsp代码 发现点了 引导符后 系统提供的自动提示出奇的慢 于是开始网络求助 搞清了原因 eclipse在编写jsp时 当点下引导符后 要去相应的javadoc 中寻找相应的解释 而他默认的寻找路径是 sun的网站
  • Kernel panic - not syncing: Requested init /linuxrc failed (error -13).

    开发板平台exynos 4413 使用busybox 1 31 1制作ext4根文件系统 Kernel panic not syncing Requested init linuxrc failed error 13 这是一个巨坑无比的错误
  • Spring IOC容器的创建过程

    在测试时 经常使用这种方式来创建spring容器 创建基于注解的springIOC容器 ApplicationContext applicationContext new AnnotationConfigApplicationContext
  • unity SteamVR Plugin导入后的两个错误的解决办法

    在unity asset store中搜索 SteamVR Plugin 找到官方提供的插件 我当时下载到的版本是1 2 1的 下载完后导入到工程里 打开里面的样例场景 共3个 运行或停止运行时会明显卡顿 报错 其中一个错误 Unity S
  • 13位10位时间戳转换日期

    工具类 时间转换 一 10位13位时间戳转String 格式 2018 10 15 16 03 27 日期 10位13位时间戳转String 格式 2018 10 15 16 03 27 日期 param timestamp param s
  • C语言:一级指针,二级指针,三级指针,指针数组,数组指针的综合示例

    本博客主要介绍一级指针 二级指针 三级指针 指针数组和数组指针的综合应用示例 下面简单介绍指针数组和数组指针的区别 指针数组 char p aaa bbbb 定义了一个数组p p中每一个元素都是一个指针 数组指针 char p 5 定义了一