3.09 笔记

一、数组与指针的关系

  1. &a[0] = a 数组名 a 在表达式中退化为指向首元素的指针,&a[0] 获取的是数组第一个元素的地址,等价于 a

  2. a[0] = \*a 首元素的值可通过下标 a[0] 或指针解引用 *a 访问,二者等价。


二、sizeof 运算符
  • sizeof运算符而非函数,计算类型或对象占用的内存大小。

  • 语法示例:

     int a[10];
     sizeof(a);      // 计算整个数组的大小(40字节,假设int为4字节)
     sizeof(a[0]);   // 计算单个元素的大小

三、数组初始化规则

数组元素的初始值取决于其存储类型:

类型存储位置初始化值
局部变量数组未初始化(垃圾值)
全局变量数组数据段自动初始化为0
静态局部变量数组数据段自动初始化为0

四、数组声明的注意事项
  1. 数组大小必须为常量表达式

    • 错误示例:int n = 10; int arr[n];(C99 前非法,C11 中为可选特性)

    • 正确做法:使用宏或枚举定义常量。

       #define SIZE 10
       int arr[SIZE];

五、指定初始化器(C99特性)
 int count[4] = { [2] = 3 };  // count[2] 初始化为3,其他元素为0

六、字符数组 vs 字符指针
类型示例存储位置可修改性
字符数组char str[20] = "hello"可修改内容
字符指针char *p = "hello"只读数据段不可修改内容

七、函数参数传递
  • scanf("%d", &i) 中必须使用 & 符号,因为 scanf 需要变量的地址(值传递机制下需显式传递指针)。

  • 对比数组传参:数组名本身是地址,无需 &

    c

    复制

     int arr[10];
     scanf("%d", arr);  // 等价于 &arr[0]

关键总结

  1. 数组名在多数情况下退化为指针,但 sizeof(a) 会计算整个数组的大小。

  2. 未初始化的局部数组包含垃圾值,全局/静态数组自动初始化为0。

  3. 数组大小应使用常量表达式定义,避免依赖编译器的变长数组支持。

  4. 字符串字面量赋值给指针时不可修改,字符数组可读写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值