数组
数组的定义,类型说明符 数组名[常量表达式] 常量表达式包括:常量和符号常量
数组的引用,数组名[下标] 下标可以是:整型常量或整型表达式
数组的初始化
可以在定义时对全部数组元素赋初值
只给一部分赋初值,其余的会自动为0,字符型为’\0’,指针型数组NULL
可以这样定义并赋初值:int x[][3] = { {1,2,3},(4,5,6) };
不能用赋值语句将一个字符串常量或字符数组直接给一个字符数组
strlen测试字符串长度,不包括’\0’
字符串指针变量和字符数组的比较
char *a; //a为字符指针变量
a="I love China!";//将字符串首元素地址赋给指针变量,合法。但赋给a的不是字符串,而是字符串第一个元素的地址
//不能对字符数组名赋值,因为数组名是常量,不能被赋值
char str[10];
str="I love China!";//非法
char * a="12345";<====>char * a; a = "12345"; //相当于将字符串的首地址给a初始化, 且字符串常量无法更改
char str[10]="12345"; 不等价于 char str[10];str[]="12345";
char * a;
scanf("%s",a);//字符指针变量未初始化,存储单元是个未知值,会出错
char * a, str[10];
a=str; //将a指向str数组的首元素
scanf("%s",a);
指针变量的值是可以改变的,而字符数组名代表一个固定的值(数组元素的首地址),不能改变。
int *a[ ]和int (*a)[ ]的区别
int *a[5]是指针数组,int ( *a)[5]是数组指针
前者表示一个数组,数组元素都是指向int型变量的指针;
后者表示一个指针,该指针指向一个int型有5个元素的数组。
第一个a是个数组名,里面保存的是int指针。
第二个a是个指针名,它指向一个包含5个数据的int数组。
计算数组的地址
一维整型数组 &a[i]的地址:a+i*4
二维整型数组
int a[3][5];
&a[i][j]的地址:a+(i*5+j)*4;
二维数组A[8][9]按行优先顺序存储,若数组元素A[2][3]的存储地址为1087,A[4][7]的存储地址为1153...
求数组元素A[6][7]的存储地址?
A[2][3]到A[4][3]有9*2=18个元素,A[4][3]到A[4][7]有4个元素,总共22个元素,
而地址相差1153-1087=66,所以每个元素占3个字节。
A[4][7]到A[6][7]有18个元素,所以A[6][7]地址为18*3+1153=1207