数组基本概念
元素类型角度:数组是相同类型的变量的有序集合
内存角度:连续的一大片内存空间
数组的初始化
//数组元素的个数可以显式或隐式指定
//数组初始化可以使用{0}或memeset两种方式
void main()
{
int a[] = {1, 2}; //隐式指定元素个数
int b[100] = {1, 3};//显式指定元素个数
int c[200] = {0}; //编译时就已经确定所有值为零
memset(c, 0, sizeof(c)); //显式的重置内存块数据
}
数组名的相关解释
- 数组首元素的地址和数组地址是两个不同的概念(如有数组int a[10],数组首元素的地址表示为数组名a,数组地址表示为数组名取地址&a)
- 数组名代表数组首元素的地址,它是个常量(不能被修改,只读)
- 数组首元素的地址和数组的地址值相等(a和&a的值相同,但是步长不同)
int a[10];
printf("得到整个数组的地址a: %d \n", &a);
printf("数组的首元素的地址a: %d \n", a);
自定义数组类型
在c语言中可以使用typedef来重定义数据类型的名称,对于数组这种复杂的数据类型,c语言同样提供了定义标准和规范。
typedef int (MyArrayType)[5]; //定义了一个数组数据类型,这里MyArrayType = int [5]
int i = 0;
MyArrayType myArray; //int myArray[5];
for (i=0; i<5; i++)
{
myArray[i] = i+1;
}
for (i=0; i<5; i++)
{
printf("%d ", myArray[i]);
}
printf("myArray代表数组首元素的地址 myArray:%d myArray+1:%d \n", myArray, myArray+1);
printf("&myArray代表整个数组的地址 &myArray:%d &myArray+1:%d \n", &myArray, &myArray+1);
定义数组指针类型
数组指针就是指向整个数组的指针类型,c语言提供了三种定义数组指针类型的方法
1、第一种方法
typedef int(MyArray)[5]; //自定义数组类型
MyArray a; //等价于int a[5]
MyArray *p; //定义一个指向数组的指针变量p
p = &a; //把数组a的地址赋给数组指针p
for (int i = 0; i < 5; i++)
{
(*p)[i] = i; //p = &a, *p就等价于a ,所以该表达式等价于a[i]
printf("%d\n", (*p)[i]);
}
2、第二种方法
typedef int (*MyPoint)[5]; //自定义一个数组指针数据类型,编译器分配四字节内存(32位下)
MyPoint p;
int a[5];
p = &a;
for (int i = 0; i < 5; i++)
{
(*p)[i] = i;
printf("%d\n", (*p)[i]);
}
3、第三种方法(推荐)
前两种方法都需要自己进行自定义类型,十分麻烦,因此c语言提供了一种可以直接定义数组指针的方法。
int (*p)[5];//直接定义一个数组指针,注意与定义指针数组的区别(int *p[5]),[]的优先级大于*
int a[5];
p = &a;
for (int i = 0; i < 5; i++)
{
(*p)[i] = i;
printf("%d\n", (*p)[i]);
}