概念
从元素类型的角度看,数组是相同类型的变量的有序集合;
从内存的角度看,数组是连续的一大片内存空间
初始化
数组的初始化比较简单,这里就不详细赘述了,现在就总结几个注意点。
注意
数组首元素的地址和数组地址是两个不同的概念。
数组名代表数组首元素的地址,它是一个常量。
数组首元素的地址和数组的地址是相等的。
C语言规定
int a[10];
printf("%d",a);//获取数组首元素的地址
printf("%d",&a);//获取整个数组的首地址
接下来总结三个重要的概念
数组类型、数组指针类型、数组指针类型变量
数组类型
我们知道,数组也是一种数据类型。
数组的类型是由元素的类型和数组的大小共同决定的。
例如:int a[5] 的类型为int [5];
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
typedef int(array)[5];//定义一个数组数据类型
array a;//用这个数组数据类型定义变量
int i = 0;
for (i = 0; i < 5; i++)
{
a[i] = i + 1;
}
for (i = 0; i < 5; i++)
{
printf("%d ", a[i]);
}
system("pause");
return 0;
}
数组指针类型
数组指针,顾名思义,它是一个指针,它指向一个数组类型变量。
定义数组指针,有三种方法:
1、通过数组数据类型定义数组指针
typedef int(array)[5];//定义一个数组数据类型
array *p;//用这个数组数据类型定义一个指针变量
2、声明一个数组指针类型
typedef int(*array)[5];//定义一个数组指针类型
array p;//定义一个数组指针类型变量
3、直接定义
int (*p)[10];
看这个例子
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//数组指针类型
int main(void)
{
// 1
/*typedef int(array)[5];
array a;//一级指针
array *p;//二级指针
p = &a;
int i;
for (i = 0; i < 5; i++)
{
(*p)[i] = i + 1;
}
for (i = 0; i < 5; i++)
{
printf("%d %d\n", a[i],(*p)[i]);
}*/
// 2
int a[5];
int(*p)[5] = &a;
int i;
for (i = 0; i < 5; i++)
{
(*p)[i] = i + 1;
}
for (i = 0; i < 5; i++)
{
printf("%d %d\n", a[i], (*p)[i]);
}
system("pause");
return 0;
}
数组指针类型变量
这个很好理解,就不在赘述了。
多维数组名本质
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//数组类型
int main1(void)
{
typedef int(array)[5];//定义一个数组数据类型
array a;//用这个数组数据类型定义变量
int i = 0;
for (i = 0; i < 5; i++)
{
a[i] = i + 1;
}
for (i = 0; i < 5; i++)
{
printf("%d ", a[i]);
}
system("pause");
return 0;
}
//数组指针类型
int main2(void)
{
// 1
/*typedef int(array)[5];
array a;//一级指针
array *p;//二级指针
p = &a;
int i;
for (i = 0; i < 5; i++)
{
(*p)[i] = i + 1;
}
for (i = 0; i < 5; i++)
{
printf("%d %d\n", a[i],(*p)[i]);
}*/
// 2
int a[5];
int(*p)[5] = &a;
int i;
for (i = 0; i < 5; i++)
{
(*p)[i] = i + 1;
}
for (i = 0; i < 5; i++)
{
printf("%d %d\n", a[i], (*p)[i]);
}
system("pause");
return 0;
}
//多维数组本质
int main(void)
{
int a[3][5];
int i, j;
int count = 1;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
a[i][j] = count++;
}
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d ", a[i][j]);
}
printf("\n");
}
int(*p)[5] = a;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 5; j++)
{
printf("%d ", p[i][j]);
}
printf("\n");
}
system("pause");
return 0;
}
多维数组名的本质是一个数组指针
(a+i) 代表整个第i行的地址 二级指针
*(a+i) 代表第i行首元素的地址 一级指针
*(a+i) + j ===> & a[i][j]
*( *(a+i) + j) ===> a[i][j]元素 的 值
a[i][j] <=== >*( *(a+i) + j)
a[i] ===> a[0+i] ==> *(a+i);
a[i][j] === a[0+i][j] ==> *(a+i)[j] ===> *(a+i)[0 + j] ==> *( *(a+i) + j)
数组就简单的总结到这里。