27_数组的本质分析

关键词:数组的本质、数组的大小、数组的地址与数组名、数组名的盲点

数组是相同类型的变量的有序集合。

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语言深度解析》所做的笔记,文章中包含狄泰软件资料内容一切版权归狄泰软件所有!

你可能感兴趣的:(27_数组的本质分析)