数组的指针特性

从一道小题下手(该考点曾被腾讯等大公司作为基础笔试题考过),

#include <stdio.h>

int size(char a[10])
{
    return sizeof(a);
}

int main(void)
{
    char a[] = {'C','h','i','n','a','\0'};
    char *p = "China";
    char *q = a;

    printf("sizeof(a)=%d\n", sizeof(a));
    printf("sizeof(p)=%d\n", sizeof(p));
    printf("sizeof(q)=%d\n", sizeof(q));
    printf("size(a)=%d\n", size(a));

    return 0;
}

在32位机的编译环境下,对C语言很熟悉的人一眼就能看出结果为:

sizeof(a)=6
sizeof(p)=4
sizeof(q)=4
size(a)=4

基于本小题,主要考究以下几点:

数组名退化成指针

仅在以下3种情况中,数组不会退化成指针,

  1. 使用sizeof(a)的时候,所以上面sizeof(a)的结果为6字节

  2. 对数组名取地址操作:&a。&a的类型为pointer to array of 6 chars,而对字符串指针取地址结果为pointer to pointer to char.

  3. 使用字符串初始化数组的时候也不会退化。

其它情况都会退化成“指向数组首元素的指针”,比如:

  1. 数组名做函数参数时,a都会退化成&a[0]指针。如上面的size函数和printf函数中的a[]都是这种情况

  2. 二维数组,char s[10][8]数组的首元素(得理解这个首元素,从一维数组的角度看的)是一维数组s[0],因此退化成&s[0]指针

数组定义字符串和指针定义字符串的区别

  1. 使用数字定义的字符串只分配字符串所需的空间(上例中为6个字节),数字名没有单独的存储空间;使用指针定义字符串,除了字符串占用的空间,还要为指针变量分配对应的空间。

  2. 数组退化成指针为“常量指针”,不可更改,而直接指向字符串的指针可修改,如

    char a[10] = "China";
    char *p = "China";
    a++;   // 错误的
    p++;   // 正确的
### 数组指针指针数组的区别及使用场景 #### 定义区别 数组指针是一个指针变量,它指向整个数组的首地址。换句话说,数组指针保存的是一个数组的起始位置[^1]。 指针数组则是由多个指针成的数组,每个指针可以独立地指向不同类型的对象或数据结构[^2]。 --- #### 声明方式 ##### 数组指针 数组指针可以通过以下形式声明: ```c int (*arrPtr)[N]; ``` 这里 `(*arrPtr)` 表示这是一个指针,`[N]` 则表示该指针指向一个长度为 N 的整型数组[^1]。 ##### 指针数组 指针数组通过如下方式进行声明: ```c int *ptrArr[N]; ``` 这表明 `ptrArr` 是一个包含 N 个元素的数组,每个元素都是一个指向 int 类型的指针[^2]。 --- #### 使用场景 ##### 数组指针的应用 1. **多维数组的操作**:当需要处理二维或多维数组时,数组指针能够简化对数组整体的访问逻辑。 ```c int array[3][4] = { /* 初始化 */ }; int (*p)[4] = array; // p 是一个指向含有 4 个整数的一维数组指针 printf("%d", p[0][1]); // 访问第一个子数组的第二个元素 ``` 这里展示了如何利用数组指针来间接访问多维数组中的元素[^1]。 2. **函数参数传递**:如果希望将整个数组作为参数传入函数,则可以使用数组指针实现更高效的内存管理。 ```c void processArray(int (*array)[5], size_t rows); ``` ##### 指针数组的应用 1. **字符串集合管理**:由于 C 字符串本质上是以 `\0` 结尾的字符数组,因此可以用指针数组存储一字符串。 ```c char *strs[] = {"hello", "world"}; printf("%s\n", strs[0]); ``` 上述代码片段说明了指针数组在管理和遍历字符串列表方面的便利性[^2]。 2. **动态资源分配**:对于某些复杂的数据结构(如链表节点),可能需要用指针数组维护一系列动态创建的对象实例。 ```c struct Node { int value; struct Node* next; }; struct Node* nodes[10]; // 创建一个大小为 10 的指针数组 for (size_t i = 0; i < 10; ++i) { nodes[i] = malloc(sizeof(struct Node)); } ``` --- #### 总结对比表格 | 特性 | 数组指针 | 指针数组 | |-----------------|-----------------------------------|-------------------------------| | 数据类型 | 单一固定尺寸的数组 | 多个独立指针 | | 存储内容 | 整体数组 | 各自单独的目标 | | 主要用途 | 函数间高效传输大块连续数据 | 动态链接离散单元 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值