C语言的数组指针和指针数组

1. 指针数组

- 含义:指针类型的数组。就是一个数组,每个元素都是指针类型。

定义:

int *p[3];  //定义

int a[3]={0};  //正常的数组

for (int i = 0;i < 3;i++)
{
    p[i] = &a[i];   //给每个指针赋值 ---> 也可以 *p[i] = a[i]
}

作用:可以直接定义很多个指针以供使用

2. 数组指针

- 含义:数组类型的指针。就是一个指针,要指向一整个数组,而这个指针就代表这一整个数组。

定义:

//表明:定义了一个 int (*)[5] 类型的指针 ---> 有五个元素的一维数组

int (*p)[5];  

//定义数组

int arr1[5];
int arr2[3];

//由于定义的指针数组是指向 --- > 有五个元素的一维数组
//因此,该指针只能指向 有五个元素的一维数组

p = &arr1; //不能指向 arr2

//验证p指向的是整个数组,而不是数组中的一个元素
//原理:当类型不同时,指针的偏移量也不同,偏移就是根据当前指针的类型偏移与当前类型相同的指针长度(就
//是 +1 后的增量不同 ---> 因为类型不同,加的 ”1“ 的大小不同)

printf("%d %d\n", p,&arr1[0]);
printf("%d %d\n",p +1 ,&arr1[0]+1);

- 用法:按找上图的定义,就相当于给 arr1 又起了一个新的名字 *p

                *p == arr1;   ---> 任何用 arr1 的地方都可以换成 *p

                (*p)[0] ==  arr1[0];     ----> 注意:[] 的优先级 大于 * 因此要加()

                (*p)[1] == arr1[1];

写法二:  *((*p) + 1) == arr1[1];    ---> 根据 [i] 就是 + i 再整体取 * 

### C语言数组指针指针数组的区别及用法 #### 定义与基本概念 在C语言中,**数组指针****指针数组**是两种不同的数据结构。 - **数组指针**是一个指针变量,指向一个完整的数组对象。它的声明形式通常是 `type (*pointer_name)[size]`[^5]。 - **指针数组**是一个数组,其每个元素都是指针类型。它的声明形式通常是 `type *array_name[size]`。 --- #### 数组指针的特点及其使用方法 数组指针的主要特点是它可以用来访问整个数组或作为函数参数传递数组。以下是具体说明: 1. **声明数组指针** 数组指针可以通过以下方式声明: ```c int array[5]; int (*ptr)[5] = &array; ``` 这里,`(*ptr)` 是一个指针,指向具有 5 个整数的数组[^2]。 2. **访问数组元素** 使用数组指针访问数组中的元素时,可以直接解引用并加上偏移量: ```c printf("%d\n", (*ptr)[0]); // 访问第一个元素 printf("%d\n", (*ptr)[1]); // 访问第二个元素 ``` 3. **应用场景** - 动态内存分配时,可以利用数组指针管理多维数组。 - 函数间传递固定大小的数组时,数组指针能更高效地表达意图[^4]。 --- #### 指针数组的特点及其使用方法 指针数组的核心特点在于它是存储多个指针的一个连续区域。下面详细介绍如何声明使用指针数组: 1. **声明指针数组** 指针数组可以通过如下方式进行声明: ```c char *strings[3] = {"hello", "world", "example"}; ``` 上述代码创建了一个包含三个字符串常量地址的指针数组[^3]。 2. **初始化与赋值** 可以为指针数组的各个元素分别赋予不同地址: ```c int a = 1, b = 2, c = 3; int *pointers[3] = {&a, &b, &c}; ``` 3. **遍历指针数组** 遍历指针数组的方式类似于普通数组: ```c for (int i = 0; i < 3; ++i) { printf("%s\n", strings[i]); } ``` --- #### 关键区别总结 | 特性 | 数组指针 | 指针数组 | |--------------------|-----------------------------------|------------------------------| | 类型 | 指向数组指针 | 存储指针数组 | | 声明 | `type (*pointer_name)[size]` | `type *array_name[size]` | | 数据布局 | 单一指针 | 多个独立指针 | | 是否可变 | 不可改变所指向的数组 | 各元素指针可单独修改 | --- #### 示例代码对比 ##### 数组指针示例 ```c #include <stdio.h> int main() { int arr[3][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}; int (*p)[4] = arr; for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { printf("%d ", p[i][j]); } printf("\n"); } return 0; } ``` ##### 指针数组示例 ```c #include <stdio.h> #include <string.h> int main() { const char *str_arr[3] = {"Hello", "World", "Example"}; for (int i = 0; i < 3; ++i) { printf("%s\n", str_arr[i]); } return 0; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值