二维数组

二维数组定义的形式:

类型  数组名[常量表达式1][常量表达式2]

例: int a[3][4],表示有3行4列分别为

a[0][0],a[0][1],a[0][2],a[0][3]
a[1][0],a[1][1],a[1][2],a[1][3]
a[2][0],a[2][1],a[2][2],a[2][3]

初始化

方法一:
int a[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};

方法二:
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

未赋初值的元素自动取0值。
例:int a[3][4] = {{1}, {2}, {3}};
1,0,0,0
2,0,0,0
3,0,0,0

作为参数传递

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void foo(int (*p)[4], int n) //p为数组指针,指向二维数组
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%d\t", p[i][j]);
}
printf("\n");
}
}
int main()
{

int b[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };
foo(b, 3);
return 0;
}

大小计算

例:a[3][4]

获得数组所占内存大小:sizeof(a),32位机上为48字节

获得数组元素的个数:sizeof(a) / sizeof(int)

取地址和步长

先看一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{

int b[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,10,11,12} };


printf("b的地址 : %p\n", b);
printf("&b[0][0]的地址 : %p\n", &b[0][0]);
printf("&b[0]的地址 : %p\n", &b[0]);
printf("&b的地址 : %p\n", &b);

printf("\n");

printf("b+1的地址 : %p\n", b + 1);
printf("&b[0][0]+1的地址 : %p\n", &b[0][0]+1);
printf("&b[0]+1的地址 : %p\n", &b[0] + 1);
printf("&b+1的地址 : %p\n", &b + 1);

return 0;
}

运行结果:

分析:
b,&b[0][0],&b[0],&b输出的地址一样,但步长不同。

b+1和&b[0]+1都是第二行首元素的地址,所以步长为一行4*sizeof(int)=16个字节

&b[0][0]+1为第一行第二个元素的地址,偏移一个元素,步长为4个字节

&b表示为整个数组的地址,步长为整个数组12*sizeof(int)个字节。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×