博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二级指针用法示例
阅读量:4124 次
发布时间:2019-05-25

本文共 5372 字,大约阅读时间需要 17 分钟。

1、二级指针的第一种内存模型:指针数组

#include 
#include
#include
void main21() //不适用二级指针的常规做法{ int i = 0, j = 0; int num = 0; char *tmp = NULL; //数组 数组中的每一个元素是指针 指针数组 char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", "111111"}; //打印 num = sizeof(myArray)/sizeof(myArray[0]); printf("排序之前\n"); for (i=0; i
0 ) { tmp = myArray[i]; //注意 交换的是数组元素 交换的是指针的值 myArray[i] = myArray[j]; myArray[j] = tmp; } } } printf("排序之后\n"); for (i=0; i
0 ) { tmp = myArray[i]; //注意:交换的是数组元素(字符串常量的首地址),交换的是指针的值 //改变的是指针的指向 myArray[i] = myArray[j]; myArray[j] = tmp; } } }}void main(){ int i = 0, j = 0; int num = 0; char *tmp = NULL; //数组 数组中的每一个元素是指针(字符串常量的首地址) 指针数组 char *myArray[] = {"aaaaaa", "ccccc", "bbbbbb", "111111"}; //打印 num = sizeof(myArray)/sizeof(myArray[0]); printf("排序之前\n"); printMyArray11(myArray, num); sortMyArray11(myArray, num); printf("排序之后\n"); printMyArray11(myArray, num); printf("hello...\n"); system("pause"); return ;}

2、二级指针的第二种内存模型:二维数组

#include 
#include
#include
//打印 排序 //封装成函数void main31(){ int i = 0, j = 0; int num = 4; char myBuf[30]; char tmpBuf[30]; char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111111"}; //打印 printf("排序之前\n"); for (i=0; i
0) { strcpy(tmpBuf, myArray[i]); //交换的是内存块 strcpy(myArray[i], myArray[j]); strcpy(myArray[j], tmpBuf); } } } //打印 printf("排序之后\n"); for (i=0; i
0) { strcpy(tmpBuf, myArray[i]); //交换的是内存块 strcpy(myArray[i], myArray[j]); strcpy(myArray[j], tmpBuf); } } }}//打印 排序 //封装成函数void main333(){ int i = 0, j = 0; int num = 4; char myBuf[30]; char tmpBuf[30]; char myArray[10][30] = {"aaaaaa", "ccccc", "bbbbbbb", "1111111111111"}; //myarray:编译器只会关心:有10行 ,每行30列。目的是: //myarray+1:多维数组名的本质,+1以后步长是多少,跳30个单元! { int len1 = sizeof(myarray); // 300 int len2 = sizeof(myarray[0]);//30 int size = len1/len2; //10 ,实际上求出来的是多少行,和一维对比 printf("len1:%d , len2:%d , size:%d \n", len1, len2, size); } //打印 printf("排序之前\n"); printMyArray02(myArray, num); sortMyArray02(myArray, num); //打印 printf("排序之后\n"); printMyArray02(myArray, num); printf("hello...\n"); system("pause"); return ;}
3、二级指针的第三种内存模型:扔开C编译器,手工打造二维内存
#include 
#include
#include
//直接写void main41(){ int i = 0, j = 0; char **p2 = NULL; int num = 5; char *tmp = NULL;//辅助下面交换指针 char tmpbuf[100];//辅助下面交换内存 //自己打造内存 p2 = (char **)malloc(sizeof(char *) * num);//char **里面装char * for (i=0; i
0 ) { tmp = myArray[i]; //注意 交换的是数组元素 交换的是指针的值 //改变指针的指向 myArray[i] = myArray[j]; myArray[j] = tmp; } } }}//释放内存void getMem41_Free(char **p2, int num) //二级指针{ int i = 0; //释放内存 for(i=0; i

4、总览二级指针的三种内存模型:

#define  _CRT_SECURE_NO_WARNINGS #include 
#include
#include
void main2(){ int i = 0; //指针数组 char * p1[] = {"123", "456", "789"}; //二维数组 char p2[3][4] = {"123", "456", "789"}; //手工二维内存 char **p3 = (char **)malloc(3 * sizeof(char *)); //int array[3]; for (i=0; i<3; i++) { p3[i] = (char *)malloc(10*sizeof(char)); //char buf[10] sprintf(p3[i], "%d%d%d", i, i, i); }}

5、三种内存模型综合演练:

/*int sort(char *p[], int count, char **p, int *ncount);int sort(char *p[], int count, char(*p)[30], int *ncount);int sort(char(*p)[30], int ncount, char **p, int *ncount);//把第一种内存模型和第二种内存模型结果copy到第三种内存模型中,并排序、打印char **sort(char **p1, int num1, char(*p)[30], int num2, int *num3);*/#include"stdio.h"#include"stdlib.h"#include"string.h"int sort(char **myp1, int num1, char (*myp2)[30], int num2, int ***myp3, int *num3){	int i = 0, j = 0, k = 0;	int tmplen = 0;	char *tmpP = NULL;//辅助指针变量,以便排序使用	//分配内存,以供拷贝	char **p3 = NULL;	p3 = (char **)malloc((num1 + num2)*sizeof(char *));  //里面装的是指针	if (p3 == NULL)	{		return -1;	}	//拷贝	for (i = 0; i < num1; i++)	{		tmplen = strlen(myp1[i]) + 1;		p3[i] = (char *)malloc(tmplen *sizeof(char));//挂内存,指向内存空间		if (p3[i] == NULL)		{			return -2;		}		strcpy(p3[i], myp1[i]);//赋值,拷贝	}	for (j = 0; j < num2; j++, i++)	{		tmplen = strlen(myp2[j]) + 1;		p3[i] = (char*)malloc(tmplen*sizeof(char));//挂内存,指向内存空间		if (p3[i] == NULL)		{			return -3;		}		strcpy(p3[i], myp2[j]);//赋值,拷贝	}	//排序	tmplen = num1 + num2;	for (i = 0; i < tmplen; i++)	{		for (j = i + 1; j < tmplen; j++)		{			if (strcmp(p3[i], p3[j])>0)			{				tmpP = p3[i];				p3[i] = p3[j];				p3[j] = tmpP;			}		}	}	//间接赋值	*num3 = tmplen;	*myp3 = p3;	return 0;}void sortFree1(char **p, int len)//第一种释放内存方法,仅释放内存{	int i = 0;	if (p == NULL)	{		return;	}	for (i = 0; i < len; i++)	{		free(p[i]);	}	free(p);}void sortFree2(char ***myp, int len)//第二种释放内存的方法,把二级指针指向的二维内存释放掉的同时间接地修改了实参的值{	int i = 0;	char **p = NULL;	if (myp == NULL)	{		return;	}	p = *myp; //还原成二级指针	if (p == NULL)	{		return;	}	for (i = 0; i < len; i++)	{		free(p[i]);	}	free(p);	*myp = NULL;    //myp是实参的地址     //间接赋值是指针存在的最大意义}int main(){	int ret = 0;	char *p1[] = { "aaaa", "ssssss", "dddddd" };//指针数组	char buf2[10][30] = { "11111", "2222", "33333333" };//二维数组	char **p3 = NULL;	int len1, len2, len3;	len1 = sizeof(p1) / sizeof(*p1);	len2 = 3;	ret = sort(p1, len1, buf2, len2, &p3, &len3);	if (ret != 0)	{		printf("func sort() err!");	}	for (int i = 0; i < len3; i++)	{		printf("%s\n", p3[i]);	}	//sortFree1(p3, len3);	sortFree2(&p3, len3);//释放内存	return ret;}

你可能感兴趣的文章
读后感:&gt;
查看>>
ideas about sharing software
查看>>
different aspects for software
查看>>
To do list
查看>>
Study of Source code
查看>>
如何使用BBC英语学习频道
查看>>
JDBC and JTP Transaction
查看>>
spring事务探索
查看>>
浅谈Spring声明式事务管理ThreadLocal和JDKProxy
查看>>
关于NP问题与P问题的认识
查看>>
数据通信之必会概念总结
查看>>
拉格朗日条件优化
查看>>
随机过程:统计独立、正交、不相关 辨析
查看>>
平稳随机过程的严平稳随机过程与宽平稳随机过程区别联系
查看>>
柯西定理与留数定理的应用总结
查看>>
最短路径算法
查看>>
python函数式编程—高阶函数练习题
查看>>
GPON技术学习(五)----------ONU七种状态
查看>>
EPON技术学习
查看>>
EPON和GPON的比较
查看>>