C语言的二维数组和二级指针的理解

1.数组本质

    int a[5] 一维数组名代表数组首元素的地址

    int a[5] ===> a的类型为int*

    二维数组名同样代表数组首元素的地址

    int b[2][5]===>b的类型为int(*)[5]

 注:二维数组名 char array[10][100] 是一个数组指针,char (*)[100]

2.二级指针的第一种内存模型:

/**
作者:一叶扁舟
时间:23:03 2016/8/20
作用:练习二维数组的第一种内存模型理解
**/
#include"stdio.h"
#include "stdlib.h"
#include "string.h"

//输出二维数组的数据
void printArray(char **myArray, int num){
	for (int i = 0; i < num; i++){
		printf("%s \n", myArray[i]);
	}
}

//从大到小的排列
void sortArray(char **myArray, int num){
	char  *temp;
	for (int i = 0; i < num; i++){
		for (int j = i + 1; j < num; j++){
			
			if (strcmp(myArray[i], myArray[j])>0){
				temp = myArray[i];
				myArray[i] = myArray[j];
				myArray[j] = temp;
			}		
		}
	}

}

int main(){
	//二维数组指针
	char *arrayData[] = { "315", "3415", "afaaa", "9888", "addddd" };

	printf("排序之前:\n");
	printArray(arrayData, 5);
	printf("排序之后:\n");
	sortArray(arrayData, 5);
	printArray(arrayData, 5);


	system("pause");
	return 0;
}


运行结果:


3.二级指针的第二种内存模型:

/**
作者:一叶扁舟
时间:20:00 2016/8/21
作用:二维数组的第二种理解
**/
#include"stdio.h"
#include "stdlib.h"
#include "string.h"


//输出函数
void printArray2(char arrayData[10][100],int num){
	for (int i = 0; i < num; i++){
		printf("%s\n",arrayData[i]);
	}

}
//字符串排序函数
void sortArray(char arrayData[10][100], int num){

	char buff[100];

	for (int i = 0; i < num; i++){
		for (int j = i + 1; j < num; j++){
			if (strcmp(arrayData[i], arrayData[j])>0){
				strcpy_s(buff, arrayData[i]);
				strcpy_s(arrayData[i], arrayData[j]);
				strcpy_s(arrayData[j], buff);
			}
		}
	}

}



int main(){
	//二维数组指针
	char arrayData[10][100] = { "34d15", "3415", "afaaa", "9888", "addddd" };

	printf("排序之前----:\n");
	printArray2(arrayData, 5);

	sortArray(arrayData, 5);
	printf("排序之后----:\n");
	printArray2(arrayData, 5);

	system("pause");
	return 0;
}

运行结果:


4.二级指针的第三种内存模型:

/**
作者:一叶扁舟
时间:20:44 2016/8/21
作用:二维数组和二维指针的第三种理解
**/
#include"stdio.h"
#include "stdlib.h"
#include "string.h"



void printArray3(char **arrayData,int num){
	for (int i = 0; i < num; i++){
		printf("%s\n",arrayData[i]);
	}
}
int main(){
	int num = 10;
	//在堆中申请内存空间
	char **arrayData = (char **)malloc(num * sizeof(char*));//相当于char array[10]; ;
	if (arrayData == NULL){
		printf("分配内存失败\n");
		return 0;
	}
	for (int i = 0; i < num; i++){
		arrayData[i] = (char*)malloc(100 * sizeof(char));
		if (arrayData[i] == NULL){
			printf("分配二维数组内存失败\n");
			return 0;
		}
		//将数据打到缓存中
		sprintf(arrayData[i], "%d,%d,%d,%d", i + 5, i * 2, i * 3, i*i*i);
	}

	//打印出数据
	printf("二维数组和二维指针的第三种用法:\n");
	printArray3(arrayData, num);
	system("pause");
	return 0;
}


运行结果:



  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值