@lishuhuakai
2015-05-17T05:47:45.000000Z
字数 2451
阅读 1719
二维指针 练习
#include <stdio.h>#include <stdlib.h>#include <string.h>void main(){//直接定义一个数组的指针//a是数组首元素的地址int a[5] = { 2, 3, 4, 5, 6 };int(*p)[5] = &a; //p是数组指针//1.myarray也是数组首元素的地址//2.myarray是一个常量指针//3.myarray是一个数组指针int myarray[3][5];for (int i = 0; i < 5; ++i){printf("%d\n", (*p)[i]);}//&a 步长 5*4 = 20;int tmp = 0;for (int i = 0; i < 3; ++i){for (int j = 0; j < 5; ++j){myarray[i][j] = tmp++;}}printf("myarray:%d myarray + 1:%d\n", myarray, myarray + 1);printf("&a:%d &a + 1:%d\n", &a, &a + 1);p = myarray; //很神奇的地方for (int i = 0; i < 3; ++i){for (int j = 0; j < 5; ++j){p[i][j] = tmp++;printf("%d ", p[i][j]);}}system("pause");}
#include <stdio.h>#include <stdlib.h>#include <string.h>//1.不管是几维数组都是线性存储的,所以说会存在多为数组做函数参数退化的问题。//2.多维数组做函数参数的时候,二维数组能够勉强表达出来,但是三维数组,四维数组就表达不出来了。//结论:指针做函数参数,有效的内存维数,只到二级..如果你看到三级指针,四级指针,它表示的不是内存的维数。void printfTwoArray(int *a, int num){for (int i = 0; i < num; i++){printf("%d ", a[i]); //从这里的输出结果可以看出多维数组在内存里线性存储}}//需要告诉编译器要跳多远void myfunc(int a[][10]){}void main(){int myarray[3][5];int tmp = 0;int *p = NULL;//定义为一个数组指针for (int i = 0; i < 3; ++i){for (int j = 0; j < 5; ++j){myarray[i][j] = tmp++;}}p = (int *)myarray;printfTwoArray(p, 3 * 5);system("pause");}
我们查看下面的一段代码:
#include <stdio.h>#include <stdlib.h>#include <string.h>//指针类型不一样=====》内存模型不一样//没有类型,哪来指针!int printfOneArray_01(char buf[64], int iNum){for (int i = 0; i < iNum; ++i){printf("%s\n", buf[i]);}return 0;}int printfOneArray_02(char buf[], int iNum){for (int i = 0; i < iNum; ++i){printf("%s\n", buf[i]);}return 0;}int printfOneArray_03(char **buf, int iNum){for (int i = 0; i < iNum; ++i){printf("%s\n", buf[i]);}return 0;}//比较下面函数参数的三种写法int printfTwoArray_01(char buf[10][30], int iNum){for (int i = 0; i < iNum; ++i){printf("%s\n", buf[i]);}return 0;}int printfTwoArray_02(char buf[][30], int iNum){for (int i = 0; i < iNum; ++i){printf("%s\n", buf[i]);}return 0;}int printfTwoArray_03(char(*buf)[30], int iNum){for (int i = 0; i < iNum; ++i){printf("%s\n", buf[i]);}return 0;}int sortArrayStr(char myArray[10][30], int iNum){//排序char buf[30];for (int i = 0; i < 4; i++){for (int j = i + 1; j < 4; ++j){if (strcmp(myArray[i], myArray[j]) > 0){strcpy_s(buf, myArray[i]);strcpy_s(myArray[i], myArray[j]);strcpy_s(myArray[j], buf);}}}return 0;}////int array[10]===>int *===>void main(){char myArray[10][30];//二维数组的数组名代表什么呢?strcpy_s(myArray[1], "aaaaa");strcpy_s(myArray[0], "bbbbb");strcpy_s(myArray[4], "ccccc");strcpy_s(myArray[5], "ddddd");strcpy_s(myArray[2], "eeeee");strcpy_s(myArray[3], "fffff");//打印第二种内存模型printf("第二种内存模型排序之前:\n");printfTwoArray_02(myArray, 5);//printfArr01(myArray, 4); //无法使用sortArrayStr(myArray, 5);printf("第二种内存模型排序之后\n");printfTwoArray_02(myArray, 5);system("pause");}