三、多维数组 多维数组的一般说明格式是: 类型 数组名[第n维长度][第n-1维长度]......[第1维长度]; 这种说明方式与BASIC、FORTRAN等语言中多维数组的说明不一样。 例如: int m[3][2]; /*定义一个整数型的二维数组*/ char c[2][2][3]; /*定义一个字符型的三维数组*/ 数组m[3][2]共有3*2=6个元素, 顺序为: m[0][0], m[0][1], m[1][0], m[1][1], m[2][0], m[2][1]; 数组c[2][2][3]共有2*2*3=12个元素, 顺序为: c[0][0][0], c[0][0][1], c[0][0][2], c[0][1][0], c[0][1][1], c[0][1][2], c[1][0][0], c[1][0][1], c[1][0][2], c[1][1][0], c[1][1][1], c[1][1][2], 数组占用的内存空间(即字节数)的计算式为: 字节数=第1维长度*第2维长度*...*第n维长度*该数组数据类型占用的字节数 4.5 变量的初始化和赋值 一、变量的初始化 变量的初始化是指变量在被说明的同时赋给一个初值。Turbo C2.0中外部变量 和静态全程变量在程序开始处被初始化, 局部变量包括静态局部变量是在进入定义 它们的函数或复合语句时才作初始化。所有全程变量在没有明确的初始化时将被自 动清零, 而局部变量和寄存器变量在未赋值前其值是不确定的。 对于外部变量和静态变量, 初值必须是常数表达式, 而自动变量和寄存器变量 可以是任意的表达式, 这个表达式可以包括常数和前面说明过的变量和函数。 1. 单个变量的初始化 例如: float f0, f1=0.2;/*定义全程变量, 在初始化时f0被清零, f1被赋0.2*/ main() { static int i=10, j; /*定义静态局部变量, 初始化时i被赋10, j不确 定*/ int k=i*5; /*定义局部变量, 初始化时k被赋10*5=50*/ char c=’y’; /*定义字符型指什变量并初始化*/
}
2. 数组变量的初始化 例如: main() { int p[2][3]={{2, -9, 0}, {8, 2, -5}}; /*定义数组p并初始化/* int m[2][4]={{27, -5, 19, 3}, {1, 8, -14, -2}};/*定义数组m并初 始化*/ char *f[]={’A’, ’B’, ’C’}; /*定义数组f并初始化*/ } 从上例可以看出: Turbo C2.0中数组进行初始化有下述规则: (1) 数组的每一行初始化赋值用"{}"并用","分开, 总的再加一对"{}"括起来, 最后以";"表示结束。 (2) 多维数组的存储是按最右维数的变量变化最快的原则。 (3) 多维数组存储是连续的, 因此可以用一维数组初始化的办法来初始化多维 数组。 例如: int x[2][3]={1, 2, 3, 4, 5, 6};/*用一维数组来初始化二维数组*/ (4) 对数组初始化时, 如果初值表中的数据个数比数组元素少, 则不足的数组 元素用0来填补。 (5) 对指针型变量数组可以不规定维数, 在初始化赋值时, 数组维数从0 开始 被连续赋值。 例如: char *f[]={’a’, ’b’, ’c’}; 初始化时将会给3个字符指针赋值, 即: *f[0]=’a’, *f[1]=’b’, *f[2]=’c’。 3. 指针型变量的初始化 例如: main() { int *i=7899; /*定义整型数指针变量并初始化*/ float *f=3.1415926; /*定义浮点数指针变量并初始化*/ char *s="Good"; /*定义字符型指针变量并初始化*/ }
二、变量的赋值 变量赋值是给已说明的变量赋给一个特定值。 1. 单个变量的赋值 (1) 整型变量和浮点变量 这两种变量采用下列格式赋值 变量名=表达式; 例如: main() { int a, m; /*定义局部整型变量a, m*/ float n; /*定义局部浮点变量f*/ a=100, m=20; /*给变量赋值*/ n=a*m*0.1;
}
说明: Turbo C2.0中允许给多个变量赋同一值时可用连等的方式。 例如: main() { int a, b, c; a=b=c=0; /*同时给a,b,c赋值*/ }
(2) 字符型变量 字符型变量可以用三种方法赋值。 例如: main() { char a0, a1, a2; /*定义局部字符型变量a0, a1, a2*/ a0=’b’; /*将字母b赋给a0*/ a1=50; /*将数字2(十进制ASCII值为50赋给a1*/ a2=’x0d’; /*将回车符赋给a2*/
}
(3) 指针型变量 例如: main() { int *i; char *str; *i=100; str="Good"; } *i表示i是一个指向整型数的指针, 即*i是一个整型变量, i是一个指向该整型 变量的地址。 *str表示str是一个字符型指针, 即保留某个字符地址。在初始化时, str没有 什么特殊的值, 而在执行str="Good"时, 编译器先在目标文件的某处保留一个空间 存放"Good"的字符串, 然后把这个字符串的第一个字母"G"的地址赋给str, 其中 字符串结尾符""是编译程序自动加上的。
对于指针变量的使用要特别注意。上例中两个指针在说明前没有初始化, 因此 这两指针为随机地址, 在小存储模式下使用将会有破坏机器的危险。正确的使用办 法如下: 例如: main() { int *i; char *str; i=(int*)malloc(sizeof(int)); i=420; str=(char*)malloc(20); str="Good, Answer!";
} 上例中, 函数(int*)malloc(sizeof(int))表示分配连续的sizeof(int)=2个字 节的整型数存储空间并返回其首地址。同样(char*)malloc(20)表示分配连续20 个 字节的字符存储空间并返回首地址(有关该函数以后再详述)。由动态内存分配函数 malloc()分配了内存空间后, 这部分内存将专供指针变量使用。 如果要使i指向三个整型数, 则用下述方法。 例如: #include main() { int *a; a=(int*)malloc(3*sizeof(int)); *a=1234; *(a+1)=4567; *(a+2)=234; } *i=1234表示把1234存放到i指向的地址中去, 但对于*(i+1)=4567, 如果认为 将4567存放到i指向的下一个字节中就错了。Turbo C2.0中只要说明i为整型指针, 则 (i+1) 等价于 i+1*sizeof(int) 同样 (i+2) 等价于 i+2*sizeof(int) #p# 2. 数组变量的赋值 (1) 整型数组和浮点数组的赋值 例如: main() { int m[2][2]; float n[3]; m[0][0]=0, m[0][1]=17, m[1][0]=21;/*数组元素赋值*/ n[0]=109.5, n[1]=-8.29, n[2]=0.7; }
(2)字符串数组的赋值 例如: main() { char s[30]; strcpy(s, "Good News!"); /*给数组赋字符串*/
} 上面程序在编译时, 遇到char s[30]这条语句时, 编译程序会在内存的某处留 出连续30个字节的区域, 并将第一个字节的地址赋给s。当遇到strcpy( strcpy 为 Turbo C2.0的函数)时, 首先在目标文件的某处建立一个"Good News!" 的字符串。 其中表示字符串终止, 终止符是编译时自动加上的, 然后一个字符一个字符地复 制到s所指的内存区域。因此定义字符串数组时, 其元素个数至少应该比字符串的 长度多1。 注意: 1. 字符串数组不能用"="直接赋值, 即s="Good News!"是不合法的。所以应分 清字符串数组和字符串指针的不同赋值方法。 2. 对于长字符串, Turbo C2.0允许使用下述方法: 例如: main() { char s[100]; strcpy(s, "The writer would like to thank you for" "your interest in his book. He hopes you" "can get some helps from the book."); }
(3)指针数组赋值 例如: main() { char *f[2]; int *a[2]; f[0]="thank you"; /*给字符型数组指针变量赋值*/ f[1]="Good Morning"; *a[0]=1, *a[1]=-11; /*给整型数数组指针变量赋值*/ }
|