数组★★★★★★★
定义数组的语法:★★★
数据类型: 数组名[元素个数]
元素个数必须是 int 型常量,不能是变量
引用数组元素语法:
1、下标可以是任意的int型变量,常量,表达式
2、下标必须从0开始
示例:定义一个一共有3个数组元素的一维 int 数组,最多可以存储3个 int 型数据
#include<stdio.h>
int main()
{
int s[3], sum=0, i; //i每个元素的下标, 3是元素的个数
s[0] = 100;
s[1] = 80;
s[2] = 59;
for(i=0; i<=2; i++)
{
sum = sum + s[i];
}
printf("%d\n", sum);
return 0;
}
#include<stdio.h>
int main()
{
int s[3]={1, 2, 3}; //定义数组的同时立即给数组元素赋初值
return 0;
}
当所赋初值少于所定义数组元素个数时,将自动给后面的元素补以初值0(注意:是数字 0 或 ‘\0’ ,不是字符 ‘0’)
注意:int t[26]; 这26个默认元素是随机数
在定义数组的同时,立即用一对大括号形式给其赋的值才为初值
例如:char a[5] = {‘@’};
char a[5] = {‘@’,’ \0’, ‘\0’, ‘\0’, ‘\0’};
一、一维数组和指针 s[i]
★★★★★★★
一维数组的数组名是一个普通的地址常量 (第二大类),存储的是数组中的第一个数组元素的地址(首地址)
#include<stdio.h>
int main()
{
int s[3] = {1, 2, 3};
int *p;
p = s; //p指向s[0], p = &s[0] <=> p指向s[0]
//p指向数组s时,一共有4种引用数组元素的方式
printf("%d\n", s[1]);
printf("%d\n", p[1]);
printf("%d\n", *(s+1));
printf("%d\n", *(p+1));
p++; //将p指针右移一位,指向下一个存储单元
printf("%d\n", p[1]);
return 0;
}
★★★★
当 p 指针指向 s 数组的首地址时,表示数组元素 s[i] 的表达方式应当有:(结果应为第一大类)
1、 s[i]
2、*(s+i)
3、*(p+i)
4、p[i]
这四种引用方式完全等价
★★★★
将一维数组作为实参传递给函数形参时,函数的形参一共有三种定义方式,三种定义方式中 a 均为普通的指针变量
1、fun( int* a )
2、fun( int a[])
3、fun( int a[M])
只有在定义函数的形参时,第 2、第 3 种形式中的 a 才是一个指针变量,而不是一个数组名
二、二维数组 s[i][j]
#include<stdio.h>
int main()
{
int s[2][3]; //定义了一个两行三列的二维数组, int型数组s
return 0;
}
定义一个两行三列的二维int数组,并立即给其赋初值
int s[2][3] = {1, 2, 3, 4, 5, 6};
注意:对于一维数组,可以在数组定义语句中省略方括号中的常量表达式通过所赋初值的个数来确定数组的大小,
对于二维数组,只可以省略第一个方括号中的常量表达式,而不能省略第二个方括号中的常量表达式,即只能省略行,不能省略列
例如:int s[][3] = {{1, 2, 3}, {1, 2, 3}};
二维数组的数组名是特殊的地址常量(第四大类),存储的是第一个数组元素的地址(首地址)
三、指针数组 *s[i]
是存放指针的数组,每个数组元素都是普通的指针变量(第二大类),
//定义一个int型指针数组s
int* s[i];
int x, y;
s[0] = &x; //s[0]指向了x, *s[0] <=> x
s[1] = &y; //s[1]指向了y, *s[1] <=> y
四、数组指针(特殊的指针) (*s)[i]
★★★★★★★
是指向一个数组的指针,且只能指向二维数组
int s[3][5];
int (*p)[5]; //定义一个特殊的int型指针变量,该指针只能指向n行五列的二维int型数组
p = s;
★★★★
建立一个行指针引用二维数组元素
1、*(p[i]+j)
2、*(*(p+i)+j)
3、(*(p+i))[j]
4、p[i][j]
★★★★★
对普通的指针(地址)加1,等价于右移1列
对特殊的指针(地址)加1,等价于下移1行
例如:
#include<stdio.h>
int main()
{
int s[2][3] = {1, 2, 3, 4, 5, 6};
int (*p)[3];
p=s;
printf("%d\n", *(p[1]+2));
return 0;
}
*(p[1]+2):p[1] 代表第一行第0列的地址(普通),然后右移2列代表第一行第二列的地址(特殊);最后用 * 引用该地址所代表的存储单元中的值 6
*(*(p+1)+2):p+1代表第一行第0列的地址(特殊),再用 * 将该特殊的地址转换为普通的地址,然后右移2列,代表第一行第2列的地址(普通),最后用 * 引用该地址所代表
的存储单元中的值
五、二维数组名和指针数组作为实参
将二维数组作为实参传递给函数形参变量时,函数一共有以下三种定义方式,三种写法中 a 均为特殊的指针变量
1、fun(double (*a)[N])
2、fun(double a[][N])
3、fun(double a[M][N])