多维数组、数组指针、函数、变长数组VLA

#include<stdio.h>
#define CLS 2 
#define ROW 2

//这三种形式等价 
//int sum_2(int (*)[CLS],int);	
//int sum_2(int [][CLS],int);
int sum_2(int a[][CLS],int n);
//这三种形式等价
//int sum_3(int [][CLS][ROW],int);
//int sum_3(int (*)[CLS][ROW],int); 
int sum_3(int a[][CLS][ROW],int n);


int main()
{
/*数组a是含4个元素的数组(一维数组a[0],a[1],a[2],a[3])。而每个元素,以a[0]为例,是一个含2个int型(a[0][0],a[0][1])的数组
*	a是数组a的首地址,a+1表示的就是a中第二个元素(即a[1])的地址,同理,a+2就是a中第3个元素(即a[2])的地址
*	又因为a[1]是一维数组的数组名,一维数组的数组名是它的首地址,所以a[1]表示的是一维数组a[1]的首地址,即a[1]=&a[1][0];
*	所以a[1]+1表示的就是一维数组a[1]的第二个地址,即a[1]+1=&a[1][1],同理,a[1]+2=&a[1][2]
*/
	int a[4][CLS]={
		{1,2},
		{3,4},
		{5,6},
		{7,8}
	};
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<CLS;j++)
		{
			printf("%d|",a[i][j]);
			printf("%d|",*(a[i]+j));
			printf("%d\t",*(*(a+i)+j));
		}
		printf("\n");
	}
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<CLS;j++)
		{
			printf("%#p|",&a[i][j]);
			printf("%#p|",a[i]+j);
			printf("%#p\t",*(a+i)+j);
		}
		printf("\n");
	}
	printf("sum=%d\n",sum_2(a,4));
	
			
	int (*p)[CLS]=a;		//数组指针 	:p指向一个含两个int类型的数组
	/*p就是a[0]的首地址
	*p+1(因为p的类型是两个int类型的数组)即+1等于跳过两个int类型,即一个a[0]大小的地址,此时p=a[1]的首地址。
	*所以每次+1表示跳过两个int类型的大小。
	*/
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<CLS;j++)
		{
			printf("%d|",p[i][j]);
			printf("%d|",*(p[i]+j));
			printf("%d\t",*(*(p+i)+j));
		}
		printf("\n");
	}		
	for(int i=0;i<4;i++)
	{
		for(int j=0;j<CLS;j++)
		{
			printf("%#p|",*(p+i)+j);
			printf("%#p|",p[i]+j);
			printf("%#p\t",&p[i][j]);
		}
		printf("\n");
	}
	printf("sum=%d\n",sum_2(p,4));
	
	/*三维数组
	*	数组b是含2个元素的数组(二维数组b[0],二维数组b[1])。而每个元素,以b[0]为例,是一个含2个元素(一维数组b[0][0],一维数组b[1][1])的数组。而b[0][0][0]又是含两个int类型元素的数组
	*	b是数组b的首地址,b+1表示的就是b中第二个元素(即二维数组b[1])的地址
	*	又因为b[1]是二维数组的数组名,二维数组的数组名是它的首地址,所以b[1]+1表示的是二维数组b[1]第二个元素(即一维数组b[1][1])的地址,即b[1][1]的地址
	*	又因为b[1][1]是一维数组的数组名,一维数组的数组名是它的首地址,所以b[1][1]表示的是一维数组b[1][1]的首地址,即b[1][1]=&a[1][1][0];
	*	所以b[1][1]+1表示的就是一维数组b[1][1]的第二个元素的位置,即b[1][1]+1=&b[1][1][1].
	*/
	int b[2][CLS][ROW]={
		{
			{1,2},
			{3,4}
		},
		{
			{5,6},
			{7,8}
		}
	};
	for(int i=0;i<2;i++)
	{
		printf("{\n");
		for(int j=0;j<CLS;j++)
		{
			printf("\t");
			for(int k=0;k<ROW;k++)
			{
				printf("%d|",b[i][j][k]);
				printf("%d|",*(*(*(b+i)+j)+k));
				printf("%d|",*(*(b[i]+j)+k));
				printf("%d\t",*(b[i][j]+k));
			}
			printf("\n"); 
		}
		printf("}\n");
	} 
	
	printf("sum=%d\n",sum_3(b,2));
	int (*p2)[CLS][ROW]=b;
	for(int i=0;i<2;i++)
	{
		printf("{\n");
		for(int j=0;j<CLS;j++)
		{
			printf("\t");
			for(int k=0;k<ROW;k++)
			{
				printf("%#p|",*(*(p2+i)+j)+k);//*(*(b+i)+j)+k
				printf("%#p|",*(p2[i]+j)+k);
				printf("%#p|",p2[i][j]+k);
				printf("%#p\t",&p2[i][j][k]);
			}
			printf("\n"); 
		}
		printf("}\n");
	} 
	printf("sum=%d\n",sum_3(p2,2));
}
int sum_2(int a[][CLS],int n)
{
	int sum=0;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<CLS;j++)
		{
			sum+=a[i][j];	
		}
	}
	return sum;
}
int sum_3(int a[][CLS][ROW],int n)
{
	int sum=0;
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<CLS;j++)
		{
			for(int k=0;k<ROW;k++)
			{
				sum+=a[i][j][k];	
			}
		}
	}
	return sum;
}
运行结果
1|1|1	2|2|2	
3|3|3	4|4|4	
5|5|5	6|6|6	
7|7|7	8|8|8	
0x7ffcf8ca1660|0x7ffcf8ca1660|0x7ffcf8ca1660	0x7ffcf8ca1664|0x7ffcf8ca1664|0x7ffcf8ca1664	
0x7ffcf8ca1668|0x7ffcf8ca1668|0x7ffcf8ca1668	0x7ffcf8ca166c|0x7ffcf8ca166c|0x7ffcf8ca166c	
0x7ffcf8ca1670|0x7ffcf8ca1670|0x7ffcf8ca1670	0x7ffcf8ca1674|0x7ffcf8ca1674|0x7ffcf8ca1674	
0x7ffcf8ca1678|0x7ffcf8ca1678|0x7ffcf8ca1678	0x7ffcf8ca167c|0x7ffcf8ca167c|0x7ffcf8ca167c	
sum=36
1|1|1	2|2|2	
3|3|3	4|4|4	
5|5|5	6|6|6	
7|7|7	8|8|8	
0x7ffcf8ca1660|0x7ffcf8ca1660|0x7ffcf8ca1660	0x7ffcf8ca1664|0x7ffcf8ca1664|0x7ffcf8ca1664	
0x7ffcf8ca1668|0x7ffcf8ca1668|0x7ffcf8ca1668	0x7ffcf8ca166c|0x7ffcf8ca166c|0x7ffcf8ca166c	
0x7ffcf8ca1670|0x7ffcf8ca1670|0x7ffcf8ca1670	0x7ffcf8ca1674|0x7ffcf8ca1674|0x7ffcf8ca1674	
0x7ffcf8ca1678|0x7ffcf8ca1678|0x7ffcf8ca1678	0x7ffcf8ca167c|0x7ffcf8ca167c|0x7ffcf8ca167c	
sum=36
{
	1|1|1|1	2|2|2|2	
	3|3|3|3	4|4|4|4	
}
{
	5|5|5|5	6|6|6|6	
	7|7|7|7	8|8|8|8	
}
sum=36
{
	0x7ffcf8ca1680|0x7ffcf8ca1680|0x7ffcf8ca1680|0x7ffcf8ca1680	0x7ffcf8ca1684|0x7ffcf8ca1684|0x7ffcf8ca1684|0x7ffcf8ca1684	
	0x7ffcf8ca1688|0x7ffcf8ca1688|0x7ffcf8ca1688|0x7ffcf8ca1688	0x7ffcf8ca168c|0x7ffcf8ca168c|0x7ffcf8ca168c|0x7ffcf8ca168c	
}
{
	0x7ffcf8ca1690|0x7ffcf8ca1690|0x7ffcf8ca1690|0x7ffcf8ca1690	0x7ffcf8ca1694|0x7ffcf8ca1694|0x7ffcf8ca1694|0x7ffcf8ca1694	
	0x7ffcf8ca1698|0x7ffcf8ca1698|0x7ffcf8ca1698|0x7ffcf8ca1698	0x7ffcf8ca169c|0x7ffcf8ca169c|0x7ffcf8ca169c|0x7ffcf8ca169c	
}
sum=36

变长数组

#include<stdio.h>
//下面两种函数原型等价 
//int sum_2(int,int,int arr[*][*]);
int sum_2(int rows,int line,int arr[rows][line]);		//arr是一个变长数组
//int sum_2(int arr[rows][line],int rows,int line);		//错误,必须arr之后,因为arr的声明需要row和line
int main()
{
	int a=2;
	int b=2;
	
	//int arr1[a][b]={1,1,1,1};		//声明一个变长数组,必须是auto类别,且不能在声明中初始化它们 	
	int arr1[a][b];	
	for(int i=0;i<a;i++)
		for(int j=0;j<b;j++)
			arr1[i][j]=i+j;
	printf("sum=%d\n",sum_2(a,b,arr1));
	
	return 0;	
}
//并未实际创建数组,当调用函数的时候,ar成为一个指向数组(含line个int 类型的值)的指针 
int sum_2(int rows,int line,int arr[rows][line])	
{
	int sum=0;
	for(int i=0;i<rows;i++)
	{
		for(int j=0;j<line;j++)
		{
			sum+=arr[i][j]; 
		}
	}
	return sum;
} 
运行结果

sum=4

猜你喜欢

转载自blog.csdn.net/liyunyou/article/details/82914012