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]