#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