C语言基础知识回顾 %超适用于计算机二级%
第五章 数组
5.1 一维数组的定义、引用和初始化
-
合法定义:直接定义,e.g.
int a[8];
或 应用 #define,e.g.#define N 10 float k[N];
或 e.g.char ch[71+10];
-
在C语言中,一个数组无法整体被引用.
对元素的合法引用: e.g.x[0]
、x[j]
、x[i+k]
等. -
合法的初始化:e.g.
int a[8]={0,1,2}; /*后面自动补0或’\0’(char类型数组)*/
或 e.g.int a[]={2,3};
相当于int a[2]={2,3};
5.2 一维数组和指针
-
在C语言中,数组名可以认为是一个存放地址值的指针变量名,其中的地址值是数组第一个元素的地址.
-
数组元素是变量值,数组名是指针/地址.
e.g.
float a[10], *p, x;
p=a; 或 p=&a[0]; /*让p指向数组a的首地址*/
/*不合法:*/ a=&x; 或 a++; /*不能给数组重新赋值*/
for (k=0; k<10; k++) p=a+k; /*让p逐个指向数组a每个元素的地址*/
引用一维数组元素的合法语句包括:
for (k=0; k<10; k++) printf (“%4d”, a[k]);
for (k=0; k<10; k++) printf (“%4d”, *(a+k));
for (k=0; k<10; k++) printf (“%4d”, *(p+k)); /*未移动指针*/
for (k=0; k<10; k++) printf (“%4d”, *p++); /*移动指针,让其逐个指向数组元素*/
for (k=0;k<10; k++) {printf (“%4d”, *p); p++;}
5.3 函数间对一维数组及其元素的引用
-
用指针或数组名作形参,用数组名或数组元素地址作实参.
-
e.g.
int fun(int *p) {…}
/*等价于int fun(int p[])和int fun(int p[M])*/
main()
{int s[M],k; k=fun(s);}
或 {int s[M]={…},k; k=fun(&s[4]);}
5.4 二维数组的定义和初始化
-
e.g.
int a[3][2]={{1,2},{},{1}};
补0→等价于int a[3][2]={{1,2},{0,0},{1,0}};
-
e.g.
int a[][2]={1,2,3,4,5,6,7};
只能省略第一个方括号中的常量表达式
等价于int a[][2]={{1,2},{3,4},{5,6},{7,0}};
或int a[4][2]={{1,2},{3,4},{5,6},{7,0}};
5.5 二维数组元素的引用
-
e.g.
double w[4][2];
w[0][1]、w[i][j]、w[i+k]、w[j+k]
引用均合法 -
e.g.
int a[4][3], i, j;
a[i][j]
等价于:*(a[i]+j)
、*(*(a+i)+j)
、(*(a+i))[j]
、*(&a[0][0]+4*i+j)
5.6 二维数组与函数
(1) 数组名做参数
#include <stdio.h>
#define M 5
#define N 3
void fun
(double a[M][N]) {…} /*数组名或指针作形参*/
/*等价于void fun (double a[][N])和void fun (double (*a)[N]) */
main( )
{
double
s[M][N];
…
fun (s); /*数组名作实参*/
}
(2) 指针数组做参数
#include <stdio.h>
#define M 5
#define N 3
void fun
(double *a[M]) {…} /*指针数组作形参*/
/*等价于void fun (double *a[])和void fun (double **a) */
main( )
{
double s[M][N], *ps[M];
…
for (i=0; i<M; i++) ps[i]=s[i];
fun (ps); /*指针数组作实参*/
}