【C语言提高25】二级指针做输入的第二种内存模型:二维数组

来源:互联网 发布:闪字风扇软件下载 编辑:程序博客网 时间:2024/05/16 18:51

打印  排序:

void main(){int i = 0,j=0;int num = 4;char tmpbuf[30] = {0};char myBuf[30] = {0};char myArray[10][30] = { "aaaaaa", "ccccc", "bbbbb", "1111111" };//打印for (i = 0; i < num; i++){printf("%s\n",myArray[i]);}//排序for (i = 0; i < num; i++){for (j = i + 1; j < num; j++){if (strcmp(myArray[i], myArray[j]) > 0)//前面的大  交换 {strcpy_s(tmpbuf,myArray[i]); //交换的是内存块   是拷贝strcpy_s(myArray[i],myArray[j]);strcpy_s(myArray[j],tmpbuf);}}}for (i = 0; i < num; i++){printf("%s\n", myArray[i]);}printf("\nhehhe");system("pause");return;}

封装成函数:

void printMyArray02(char myArray[10][30],int num){int i = 0;for (i = 0; i < num; i++){printf("%s\n", myArray[i]);// printf("%s\n", *(myArray+i));}}void sortArray02(char myArray[10][30], int num){int i = 0, j = 0;char tmpbuf[30] = { 0 };//排序for (i = 0; i < num; i++){for (j = i + 1; j < num; j++){if (strcmp(myArray[i], myArray[j]) > 0)//前面的大  交换 {strcpy_s(tmpbuf, myArray[i]); //交换的是内存块   是拷贝strcpy_s(myArray[i], myArray[j]);strcpy_s(myArray[j], tmpbuf);}}}}void main(){int num = 4;char myBuf[30] = { 0 };char myArray[10][30] = { "aaaaaa", "ccccc", "bbbbb", "1111111" };//myArray: 编译器只会关心 有10行  每行30列    所以myArray+1 会直接往跳一行 30个单元  //myArray[i]  *(myArray+i)对于二维数组 它们直接加相应的行数    这就是多维数组名的本质  名加1代表增加相应的行数 {int len1 = sizeof(myArray); //300         这是求出这数据类型的总大小int len2 = sizeof(myArray[0]);//30        这样是求每一行的大小//int len2 = sizeof(myArray[0][0]);//1    这样才是求每一个元素的大小int size = len1 / len2;//10               所以求出的是行数printf("size:%d\n", size);}printMyArray02(myArray, num);sortArray02(myArray,num);printMyArray02(myArray, num);printf("\nhehhe");system("pause");return;}

但是调用第一种内存模型的printMyArray01是错误的:

void printMyArray01_err(char**myArray, int num){int i = 0;for (i = 0; i < num; i++){printf("%s\n", myArray[i]);}}

问题的本质是:二级指针做输入的第一种内存模型 myArray+1

                            二级指针做输入的第二种内存模型 myArray+1 不一样


也就是指针的步长不一样  也就是说指针所指向内存空间的数据类型不一样

原因在于多维数组名的本质是一个数组类型的指针    并不是二级指针

0 0
原创粉丝点击