一、数组的概念
从元素类型角度:数组是相同诶性的变量的有序集合。
从内存角度讲:连续的一大片的内存空间。
注:
1)数组首元素的地址和数组的地址是两个不同的概念。
-》下面代码就可说明:
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
int a[5];
printf("得到整个数组的地址a: %d %d\n", &a,&a+1);
printf("数组的首元素的地址a: %d %d\n",a,a+1);
system("pause");
}
输出:
得到整个数组的地址a: 9828088 9828108
数组的首元素的地址a: 9828088 9828092
请按任意键继续. . .
注:
上面的&a代表了数组的地址,我们可以通过看&a+1的步长来证明,&a+1比&a的地址大了20个字节,元
素个数 = 20/sizeof(int) = 5 ,刚刚好是整个数组的全部长度。而我们的a和a+1的步长只有4个字节,刚好是一个
元组的字节。
2)数组名代表数组首元素的地址,他是一个常量。
-》变量的本质是内存空间的别名,一定义数组,就分配内存,内存分配后,内存就会被固定下
来,因此数组名起名之后就别能被更改。
3)数组首元素的地址和数组的地址相等。
二、数组类型
数组类型由元素类型和数组大小共同决定。
定义语法:typedef 数据类型(自定义类型名称)[数组大小];
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
typedef int(Array5)[5];
Array5 a; // int a[5] a是一个数组,也是一个数组类型的变量
for (int i = 0; i < 5; i++)
{
a[i] = i;
}
printf("%d\n", sizeof(a));
for (int i = 0; i < 5; i++)
{
printf("%d ", a[i]);
}
system("pause");
}
输出:
20
0 1 2 3 4 请按任意键继续. . .
三、数组指针类型
数组指针的本质还是一个指针,这个指针指向了一个数组,我们在开始的时候说过,数组名是数组首元素的起始地址,但并不是数组的起始地址,我们通过对数组名使用 '&' 可以得到整个数组的起始地址。
我们定义一个数组指针有三种方式:
1、通过定义数组类型去定义数组指针。
#define _CRT_SECURE_NO_WARNINGS
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main(void)
{
typedef char(ArrayChar5)[5];
ArrayChar5 *myarray = NULL;
//myarray 的本质也只是一个字符二维指针
printf("sizeof(ArrayChar5):%d sizeof(myarray):%d sizeof(*myarray):%d \n",sizeof(ArrayChar5), sizeof(myarray),sizeof(*myarray));
char a[5] = "dsdq";
myarray = &a;
for (int i = 0; i < 4; i++)
{
//数组指针的本质就是一个二维指针
printf("*(*myarray+%d): %c \n",i,*(*myarray+i));
}
printf("*myarray:%s\n",*myarray);
system("pause");
return 0;
}
输出:
sizeof(ArrayChar5):5 sizeof(myarray):4 sizeof(*myarray):5
*(*myarray+0): d
*(*myarray+1): s
*(*myarray+2): d
*(*myarray+3): q
*myarray:dsdq
请按任意键继续. . .
2、通过定义数组指针类型去定义变量。
int main(void)
{
typedef char(*ArrayChar5)[5];
ArrayChar5 myarray = NULL;
//myarray 的本质也只是一个字符二维指针
printf("sizeof(ArrayChar5):%d sizeof(myarray):%d sizeof(*myarray):%d \n", sizeof(ArrayChar5), sizeof(myarray), sizeof(*myarray));
char a[5] = {'0'};
myarray = &a;
for (int i = 0; i < 4; i++)
{
*((*myarray) + i) = i+1+'0';
}
for (int i = 0; i < 4; i++)
{
//数组指针的本质就是一个二维指针
printf("*(*myarray+%d):%c\n", i, *((*myarray) + i));
}
printf("*myarray:%s\n", *myarray);
system("pause");
return 0;
}
输出:
sizeof(ArrayChar5):4 sizeof(myarray):4 sizeof(*myarray):5
*(*myarray+0):1
*(*myarray+1):2
*(*myarray+2):3
*(*myarray+3):4
*myarray:1234
3、直接去定义一个数组指针变量。
int main(void)
{
char a[5];
char(*ArrayChar5)[5] = &a;
//ArrayChar5的本质也只是一个字符二维指针
printf("sizeof(ArrayChar5):%d sizeof(*ArrayChar5):%d \n", sizeof(ArrayChar5),sizeof(*ArrayChar5));
for (int i = 0; i < 4; i++)
{
*((*ArrayChar5) + i) = i + 1 + '0';
}
*((*ArrayChar5) + 4) = '\0'; //字符串结尾是字符‘\0’
for (int i = 0; i < 4; i++)
{
//数组指针的本质就是一个二维指针
printf("*(*myarray+%d):%c\n", i, *((*ArrayChar5) + i));
}
printf("*myarray:%s\n", *ArrayChar5);
system("pause");
return 0;
}
输出:
sizeof(ArrayChar5):4 sizeof(*ArrayChar5):5
*(*myarray+0):1
*(*myarray+1):2
*(*myarray+2):3
*(*myarray+3):4
*myarray:1234
请按任意键继续. . .
四、总结
数组类型的本质是一个数据类型,由数组类型定义的变量,是一个数组。
数组指针的本质是一个指向数组的二级指针。