一、数组的定义以及初始化
1.整型数组:
在C89中,不支持使用变量定义数组的长度
①一维整型数组
数组名是一个指针常量,保存的是首元素的地址(不可做自加操作)
在定义的时候初始化:int a[3] = {1,2,3} 或 int a[ ] = {1,2,3}
键盘读入初始化(五种方法):
int *p = a;
for(i = 0; i < 3; i++)
{
scanf(“%d”,&a[i]);
/scanf(“%d”,a+i);
/scanf(“%d”,p++);
/scanf(“%d”,p+i);
/scanf(“%d”,&p[i]);
}
输出(五种方法):
for(i = 0; i < 3; i++)
{
printf(“a[%d] = %d”, i,a[i]);
printf(“a[%d] = %d”, i,*(a+i));
printf(“a[%d] = %d”, i,*(p++));
printf(“a[%d] = %d”, i,p[i]);
printf(“a[%d] = %d”, i,*(p+i));
}
内存结构图:
&a:数组的地址
a:数组首元素的地址
&a + 1:跳一个数组的长度
a + 1:跳一个元素的长度
由此可以得出结论:
&a:对一位数组数组名取地址等于数组的地址
*(&a):对一维数组的地址取值等于数组首元素的地址
&a保存在一个数组指针变量中 int (*pa)[MAX_SIZE] = &a
所以,*(&a) = *pa
②二维整型数组
定义的时候可以省略行数,但不能省略列数
二维数组数组名:首个一维数组的地址
初始化:scanf(“%d”, *(a + i) + j);
输出:printf(“%d”,*(*(a + i) + j));
内存结构:
由上图可以看出
a = 0x1000;
a[0][0] = *a;
*(&a) = a; //对二维数组的地址取值等于首个一维数组的地址
所以*(*(a+ i) + j)的解析为:
a + i:第i + 1个一维数组的地址
*(a + i):第i + 1个一维数组的首元素的地址
*(a + i) + j:第i + 1个一维数组的第j + 1个元素的地址
*(*(a + i) + j):第i + 1个一维数组的第j + 1个元素的值
③三维整型数组
*(*(*(a + i) + j) + k)的解析为:
a + i:第i + 1个二维数组的地址
*(a + i):第i + 1个二维数组的首个一维数组的地址
*(a + i) + j:第i + 1个二维数组的第j + 1个一维数组的地址
*(*(a + i) + j):第i + 1个一维数组的第j + 1个元素的值
2.字符型数组
①一维字符型数组
初始化:
scanf("%s", str);
输出:
printf("%d", str);
②二维字符型数组
int str[3][100]
初始化:
for(i = 0; i < 3; i++)
{
scanf("%s", *(str + i));
}
输出:
for(i = 0; i < 3; i++)
{
printf("%d\n", *(str + i));
}
二、数组名的作用
1.一维数组:数组名是指针常量,保存的是数组首元素的地址
2.二维数组:数组名是指针常量,保存的是首个一维数组的地址
3.三维数组:数组名是指针常量,保存的是首个二维数组的地址
三、数组指针
是一个指针变量,保存的是数组的地址
1.定义
char (*pa) [3][100];
2.初始化
*pa = src 或者 char (*pa) [3][100] = &src
3.作用
在函数传参的时候会使用到数组指针
一维数组名用指针来传
二维数组名用一维指针数组来接
三维数组名用三维指针数组来接
四、指针数组
指针数组里定义的指针都是野指针,需要用malloc()来分配空间
1.定义
int *pa[3];
2.初始化:
for(i = 0; i < 3; i++)
{
pa[i] = (int *)malloc(sizeof(int));
scanf("%d", pa[i]);
printf("%d", *pa[i]);
}
3.在定义函数时,数组指针要用指针的指针来接