多维数组的【】和多级指针*转化推演

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]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值