二维数组的定义

二维数组的定义

一、二维数组的定义

类型名 变量名[常量表达式][常量表达式] 这个方括号只是说明他的类型。

二维数组类似一个表单如下图所示

二、二维数组的引用

数组名[下标][下标]

第一个是行号 ,第二个是列号,超过所容纳的范围,会造成越界访问。三、二维数组的特点

1、本质上有三个元素,每一个元素都有长度为4 的一维数组

单一性有序性连续性注意

不能a[0]=a[1],该相当于一维数组的数组名,代表首地址,相当于变量名不能整体赋值。数组元素可以出现在表达式中,也可以被赋值,例如:b[1][2]=a[2][3]/2在使用数组元素时应该注意,下标值应在已定义的数组大小的范围内。四、二维数组的初始化和赋值

1、方式1

因为我们相当于对一维数组初始化,一维数组里面又由长度为四个元素组成

2、方式2

去掉花括号,但是少一个数字,认为是最后一个数字为0

3、方式3

可以对部分元素赋初值。例如:int a[3][4]={{1},(5},(9)};

注意

行数可以省略,但是列数不能省略。总而言之,只能省略靠近变量名的那个a 代表数组的数组首元素的地址a = a[0] = &a[0][0]只是角度不同,但是描述的是同一个位置。4、数组的赋值

采用for 循环将数组一个一个提出来进行赋值

5、打印数组

for(i = 0;i < rows;++i)

{

puts(s[i]);

}

6、求行数和列数

五、二维数组的应用

5.1 求边框的和

5.2、垂直镜像

int main()

{

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

int rows = sizeof(a)/ sizeof(a[0]);

int cols = sizeof(a[0])/ sizeof(a[0][0]);

int i,j;

for(i = 0,i< rows;++i)

{

for(j= 0;j< cols / 2;++j)

{

int t;t= a[i][j];

a[i][j]= a[i][cols -j- 1];

a[i][cols-j -1]= t;

}

}

for(i = 0;i < rows;++i)

{

for(j= 0;j< cols;++j)

{

printf("%-2d ",a[i][j]);

}

printf("\n");

}

return 0;

}

5.3、魔方阵

int main()

{

int a[3][3] = {0};

int i = 0;

int j = 1;

int n = 1;

a[i][j] = 1;

for(n = 2;n < 10;++n)

{

int x,y;

x = i;

y = j;

++j;

--i;

if(i < 0)

{

i = 2;

}

if(j > 2)

{

j = 0;

}

if(a[i][j] != 0)

{

i = x;

j = y;

++i;

if(i > 2)

{

i = 0;

}

}

a[i][j] = n;

}

for(i = 0;i < 3;++i)

{

for(j = 0;j < 3;++j)

{

printf("%2d",a[i][j]);

}

printf("\n");

}

return 0;

实际上是对元素的下标位置进行改变。

5.4 二维数组的逆序输出

char s[][100] = {"Hello","world","china","America"};

int rows = sizeof(s) / sizeof(s[0]);

int i;

for(i = 0;i < rows /2;++i)

{

char t[100];

strcpy(t,s[i]);

strcpy(s[i],s[rows - i - 1]);

strcpy(s[rows - i - 1],t);

}

for(i = 0;i < rows;++i)

{

puts(s[i]);

}

5.5 冒泡排序

char s[][100] = {"Hello","world","china","America"};

int rows = sizeof(s) / sizeof(s[0]);

int i,j;

char str[100] = "china";

int begin = 0;

int end = rows - 1;

int mid;

for(i = rows - 1;i > 0;--i)//下标 rows - 1

{

for(j = 0;j < i;++j)

{

if(strcmp(s[j],s[j+1]) > 0)

{

char t[100];

strcpy(t,s[j+1]);

strcpy(s[j+1],s[j]);

strcpy(s[j],t);

}

}

}

while(begin <= end)

{

mid = (begin + end) / 2;

if(strcmp(str,s[mid]) > 0)

{

begin = mid + 1;

}

else if(strcmp(str,s[mid]) < 0)

{

end = mid -1;

}

else

{

break;

}

}

if(begin <= end)

{

printf("found");

}

else

{

printf("not found");

}

for(i = 0;i < rows;++i)

{

puts(s[i]);

}

return 0;