关键词:数组的本质、数组的大小、数组的地址与数组名、数组名的盲点
数组是相同类型的变量的有序集合。
1. 数组的大小
问题:编程中如何得到数组的大小?
#include
int main()
{
int a[] = {1,2,3};
printf("count for a: %d\n", sizeof(a) / sizeof(int));
return 0;
}
输出结果:
count for a: 3
2. 数组的地址与数组名
(1) 数组名代表数组首元素的地址
(2) 数组的地址需要用取地址符&才能得到
(3) 数组首元素的地址值与数组的地址值相同
(4) 数组首元素的地址与数组的地址是两个不同的概念
#include
int main()
{
int a[] = {1, 2, 3};
printf("a = %p\n", a);
printf("&a = %p\n", &a);
printf("&a[0] = %p\n", &a[0]);
return 0;
}
输出结果:
a = 0xbfb3c114
&a = 0xbfb3c114
&a[0] = 0xbfb3c114
a: 数组名
&a: 数组的地址
&a[0]:数组的起始地址
数组的地址包含两层含义:一是数组的起始地址,二是所占用的内存的长度(多少个字节)。
数组的起始地址也包含两层含义:一是起始地址,二是第一个元素所占内存的长度。
3. 数组名的盲点
(1) 数组名可以看作一个常量指针;
(2) 数组名“指向”的是内存中数组首元素的起始位置;
(3) 数组名不包含数组的长度信息;
(4) 在表达式中数组名只能作为又值使用;
(5) 当数组名作为sizeof操作符的参数或作为&运算符的参数时不能看作常量指针。
#include
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));
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));
return 0;
}
输出结果
a = 0xbfe0d1cc
p = 0xbfe0d1cc
&p = 0xbfe0d1c0
sizeof(a) = 20
sizeof(p) = 4
b = 0xbfe0d1c4
p = 0xbfe0d1c4
&p = 0xbfe0d1c0
sizeof(b) = 8
sizeof(p) = 4
总结:
(1) 数组是一片连续的内存空间;
(2) 数组的地址和数组首元素的地址意义不同;
(3) 数组名在大多数情况下被当成常量指针处理;
(4) 数组名其实并不是指针,不能将其等同于指针。
声明:此文章为本人在学习狄泰软件学院《C语言深度解析》所做的笔记,文章中包含狄泰软件资料内容一切版权归狄泰软件所有!