数组的概念
- 数组是相同类型的变量的有序集合
int s[6];
s代表数组第一个元素的起始地址。
每个匀速都是int型数据
这24个字节空间的名字为s,s[0],s[1]都是s中的元素,并非元素的名字,数组中的元素没有名字。
- 数组是相同类型的变量的有序集合
数组的大小
1.数组在一片连续的内存空间中存储元素 2.数组元素的个数可以显示或隐式指定
例如:
int s[6] = {1,2}; int t[] = {1,2};
#include <stdio.h>
int a[5]; //全局
int main()
{
int s[6] = {1, 2};
int t[] = {1, 2};
int b[5]; //局部
printf("s[2] = %d\n", s[2]);
printf("s[3] = %d\n", s[3]);
printf("s[4] = %d\n", s[4]);
printf("sizeof(s) = %d\n", sizeof(s));
printf("sizeof(t) = %d\n", sizeof(t));
printf("count for s: %d\n", sizeof(s)/sizeof(s[0]));
printf("count for t: %d\n", sizeof(t)/sizeof(t[0]));
printf("a[0] = %d\n",a[0]);
printf("b[0] = %d\n",b[0]);
return 0;
}
编译结果如下:
这里值得注意的是数组变量在没有自定义初始化的情况下,全局数组变量会被默认初始化为0而局部数组变量则被初始化为随机值。
3.数组地址与数组名
1.数组名代表数组首元素的地址
2.数组地址需要用取地址符&才能得到
3.数组首元素的地址值与数组的地址值相同
4.数组的首元素地址与素组的地址是两个不同的概念。
#include <stdio.h>
int main()
{
int s[6] = { 0 };
printf("s = %p\n", s);
printf("&s = %p\n", &s);
printf("&s[0] = %p\n", &s[0]);
return 0;
}
4.数组名的盲点
1.数组名可以看做一个常量指针
2.数组名“指向”的是内存中数组首元素的起始地址位置
3.数组名不包含数组的长度信息
4.在表达式中数组名只能作为右值使用
5.只有在下列场合中数组名不能看做常量之怎
-数组名作为sizeof操作符的参数
-数组名作为&运算符的参数
#include <stdio.h>
int main()
{
int a[5] = {0};
int b[2];
int* p = NULL;
p = a;
printf("a = %p\n", a);
printf("p = %p\n", p);
printf("&p = %p\n", &p);
printf("sizeof(a) = %d\n", sizeof(a));
printf("sizeof(p) = %d\n", sizeof(p));
printf("\n");
p = b;
printf("b = %p\n", b);
printf("p = %p\n", p);
printf("&p = %p\n", &p);
printf("sizeof(b) = %d\n", sizeof(b));
printf("sizeof(p) = %d\n", sizeof(p));
// b = a;
return 0;
}