- a[i][j]<==>*(*(a+i)+j)
-
- a[i]==>a[0+i]==>*(a+i)
-
-
- //a[i][j]==>a[0+i][j]==>*(a+i)[j]==>*(a+i)[0+j]==>*(*(a+i)+j)
- //[]是从左到右进行运算的
二.多维数组左函数参数的退化原因大剖析
多维数组名的本质就是一个指向一维数组的指针。是个二级指针。
- void printArray01(int a[3][5]) //4k
- {
- int i, j, tmp;
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < 5; j++)
- {
- printf("%d ", a[i][j]);
- }
- }
- }
-
- void printArray02(int a[][5])//a是一个指向一维数组的指针 //5k
- {
- int i, j, tmp;
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < 5; j++)
- {
- printf("%d ", a[i][j]);
- }
- }
- }
-
-
- void printArray03(int (*b) [5])//可以把a[]变为(*a) //6k
- {
- int i, j, tmp;
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < 5; j++)
- {
- printf("%d ", b[i][j]);
- }
- }
- }
-
-
- //多维数组做函数参数的退化过程。。。事实存在,为什么会存在这种退化的过程?
- void main()
- {
- int a[3][5];
- int i = 0;
- int j = 0;
- int tmp = 1;
- for (i = 0; i < 3; i++)
- {
- for (j = 0; j < 5; j++)
- {
- a[i][j] = tmp++;
- }
- }
-
- printArray03(a);
三.多维数组做函数参数退化总结。
- #include<stdlib.h>
- #include<string.h>
- #include<stdio.h>
-
-
- void printArray01(int *array,int size)
- {
- int i = 0;
- for (i = 0; i < size; i++)
- {
-
- printf("%d ", array[i]);
- }
- }
-
- void main()
- {
- int a[3][5];
- int i, j, tmp = 1;
- for (int i = 0; i < 3; i++)
- {
- for (int j = 0; j < 5; j++)
- {
- a[i][j] = tmp++;
- }
- }
-
- //把二维数组当做一维数组来打印,如果可以线性打印出来就可以证明其是线性存储的
- printArray01((int*)a,15);
-
- printf("Hello...\n");
- system("pause");
- return;
- }
四.多维数组做函数参数的技术推演
1.C语言中只会以机械式的值拷贝的方式传送参数(实参把值传给形参)
- int fun(char a[20],size_t b)
- {
- printf("%d\t%d",b,sizeof(a));
- }
原因1:高效
原因2:C语言处理a[n]的时候,它没有办法知道n是几,它只知道&a[0]是多少,它的值作为参数传递进去了 ;虽然C语言可以直接做到int fun(char a[20]),C++编译器选择了不作为,即函数能得到20这个数字,但是C没有这么做。
2.二维数组参数同样存在退化的问题
二维数组可以看做是指向一维数组的指针;
二维数组中的每一个元素都是一维数组;
二维数组参数中第一维的参数可以省略;
- void f(int a[5])==>void f(int a[]);==>void f(int* a);
-
- void g(int a[3][3])==>void g(int a[][3])==>void g(int (*a)[3]);
3.等价关系
数组做函数参数 等效的指针参数
- 一维数组 char a[30] 指针 char *a
- 指针数组 char *a[30] 指针的指针 char**a
- 二维数组 char a[10][30] 数组的指针 char(*a)[30]