C语言学习笔记16——数组的本质

本文深入讲解了C语言中数组的基本概念及其特性,包括数组的定义、初始化方式、内存分配特点等,并通过具体示例演示了如何理解数组的大小、数组名的含义及使用限制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数组的概念

在C语言中:

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

数组大小

  • 数组在一片连续的内存空间中存储元素
  • 数组元素的个数可以显示或隐式指定

例:

int a[5] = {1, 2};
int b[] = {1, 2};

问题:
1. a[2], a[3], a[4] 的值是多少?
2. b包含了多少元素

/* 测试代码 */

#include <stdio.h>

int main()
{
    int a[5] = {1, 2};
    int b[] = {1, 2};

    printf("a[2] = %d\n", a[2]);    // a[2] = 0
    printf("a[3] = %d\n", a[3]);    // a[3] = 0
    printf("a[4] = %d\n", a[4]);    // a[4] = 0

    printf("sizeof(a) = %d\n", sizeof(a));      // sizeof(a) = 20
    printf("sizeof(b) = %d\n", sizeof(b));      // sizeof(b) = 8

    printf("count for a: %d\n", sizeof(a)/sizeof(int));         // count for a: 5
    printf("count for b: %d\n", sizeof(b)/sizeof(int));         // count for b: 2

    return 0;
}

运行结果

a[2] = 0
a[3] = 0
a[4] = 0
sizeof(a) = 20
sizeof(b) = 8
count for a: 5
count for b: 2

数组的分析1: 数组地址与数组名

  1. 数组名代表数组首元素的地址

  2. 数组的地址需要用取地址符 & 才能得到

  3. 数组首元素的地址值与数组的地址值相同

  4. 数组首元素的地址与数组的地址是两个不同的概念

/* 测试代码 */

#include <stdio.h>

int main()
{
    int a[5] = { 0 };

    printf("a = %p\n", a);
    printf("&a = %p\n", &a);
    printf("&a[0] = %p\n", &a[0]);

    return 0;
}

运行结果

a = 0022FF1C
&a = 0022FF1C
&a[0] = 0022FF1C

数组的分析2:数组名的盲点

  • 数组名可以看做一个常量指针 (注意: 数组名并不是指针)

  • 数组名 “指向” 的是内存中数组首元素的起始位置

  • 数组名不包含数组的长度信息

  • 在表达式中数组名只能作为右值使用

  • 只有在下列场合中数组名不能看做常量指针

    • 数组名作为 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));   // sizeof(a) = 20 (由此可知, 数组名并不是指针)
    printf("sizeof(p) = %d\n", sizeof(p));   // sizeof(p) = 4


    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));

    return 0;
}

运行结果

a = 0022FF1C
p = 0022FF1C
&p = 0022FF10
sizeof(a) = 20
sizeof(p) = 4

b = 0022FF14
p = 0022FF14
&p = 0022FF10
sizeof(b) = 8
sizeof(p) = 4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值