二维数组
在内存
中存储在一段连续的空间中。
元素的类型 数组名[第一维元素的个数][第二维元素的个数];
示例:
#define NUM1 = 10
#define NUM2 = 10
char str[NUM1][NUM2];
short a[NUM1][NUM2];
int b[NUM1][NUM2];
long c[20][5];
float d[5 * 2][5];
注意:
在C89和C90中,元素的个数
在编译的时候必须是确定的,也就是说,元素的个数
必须是常量
或者常量表达式
。
在C99中,元素的个数
可以在运行时确定,也就是说,元素的个数
也可以是变量
或者变量表达式
。
int main(int argc, char** argv) {
double d[argc];
}
说明:上面这个数组声明在C99中是正确的,而在C89和C90中 中是错误的。
在运行时确定大小并不意味着元素的个数
可以变化,因为数组的大小一旦确定了,就不能改变大小了。
初始化
就是首次赋值。
二维数组
的初始化
有很多种方式。
示例:
int main() {
char str[5];
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
str[3] = 'd';
str[4] = '\0';
return 0;
}
示例:
#include<string.h>
int main() {
char str[10];
memset(str, 0, 10);
return 0;
}
示例:
int main() {
char str[10];
for (int i = 0; i < 10; i++) {
str[i] = '\0';
}
return 0;
}
注意:这种方式的效率很差,不建议使用。
声明的同时赋值
,这种赋值方式是在编译阶段
进行的。这样将减少运行时间,提高效率。
声明的同时赋值
的语法格式:
元素的类型 数组名[元素的个数] = {值1, 值2, ...值N};
示例:
int a[5] = {1, 3, 5, 7, 9};
此时,声明的元素的个数
可以省略,变成如下:
int a[] = {1, 3, 5, 7, 9};
这种缺少声明的元素的个数
的情形,编译器根据后的大括号中的个数来确定。
示例:
int a[5] = {1, 3};
此时,其余的元素会根据数据类型赋予默认的初值。
上面的代码等同于如下的代码:
int a[] = {1, 3, 0, 0, 0};
根据这个特点,我们可以把所有元素都赋值为0
:
char str[10] = {0};
这里将所有的字符元素都初始化为ASCII
码为0
的字符,其实就是'\0'
, 它是字符串
的结束符。
数组元素
是组成数组的基本单元。必须能够访问到每个数组元素
,访问数组元素
的格式:
数组名[下标]
下标
的范围为[0 ~ 元素的个数-1]
,如int a[5]
表示数组a
有5
个元素。 这5
个元素分别为a[0]
、a[1]
、a[2]
、a[3]
、a[4]
。
下标
只能为整型常量或整型表达式。如果为浮点数,编译器
将自动取整。
示例:
a[5]
a[i+j]
a[i++]
二维数组
的数组名
就是该数组的指针
,只是它是一个常量
, 你不能直接对他进行++
、--
等操作,只能将它赋给其他指针变量,对其他指针变量进行此等操作。
示例:
int a[] = {1, 3, 5, 7, 9};
int *p = a;
p++;
九九乘法表:
#include<stdio.h>
#define MAX 10
int main() {
int i, j;
for(i = 1; i < MAX; i++) {
for(j = 1; j <= i; j++) {
printf("%dx%d=%-2d ", i, j, i * j);
}
printf("\n");
}
return 0;
}
使用cc命令编译:
cc -o test test.c
运行效果如下: