数组指针与指针数组

本文详细解析了数组指针与指针数组的概念及其应用。首先介绍了数组指针和指针数组的定义,接着阐述了数组指针与数组元素之间的对应关系,并通过实例演示了如何使用数组指针来遍历二维数组。

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

一、数组指针与指针数组

1、数组指针与指针数组的定义

1)数组指针
数组指针是一个可以指向数组的指针,其大小是4个字节;(地址的长度是32位 = 4B)
例如:int (*p1)[5];
【注】根据平时定义变量的形式(数据类型 + 变量名),可以这样来理解数组指针:int (*)[5]p1,int (*)[5]是指针类型,p2是指针变量;

p1

2)指针数组
指针数组是包含多个指针的数组,若数组元素是n,则大小是4n个字节;
例如:int *p2[5];
【注】p2中有5个元素,每个元素都是一个int类型的指针;

p2

2、数组指针与数组元素对应关系

假设: char a[5] = {'a', 'c', 'e', 'g'}; char (*p)[5] = &a;
p = &a = *p = a , **p = (*p)[0] = a[0] = a ;
【注】 &a 表示数组的首地址, a 表示数组第一个元素的地址;同理 p*p 的含义也不相同;

因此char (*p)[5] = &a; 不能写成char (*p)[5] = a; 尽管 &aa 的值相同;

3、使用数组指针遍历二维数组

#include <stdio.h>                                                                             

int main(void)
{
    int a[3][2] = {1, 3, 5, 7, 9, 11};
    int (*p)[2] = &a[0];
    int i = 0, j = 0;
    for(i = 0;i < 3;i++)
    {   
        for(j = 0;j < 2;j++)
        {   
            printf("a[i][j] = %d, ", a[i][j]);
            printf("*(*(p+i)+j) = %d, ", *(*(p+i)+j));
            printf("(*(p+i))[j] = %d\n", (*(p+i))[j]);
        }   
    }   
    return 0;
}
【注】a[i][j] = *(*(p+i)+j) = (*(p+i))[j] ≠ *(p+i)[j] 或 **(p+i)+j
分析:
a. *(p+i)[j] = *(p+i+j) = a[i+j][0] 因为 * 的优先级不如 [] ;
b. **(p+i)+j = a[i][0]+j
### 数组指针指针数组的区别 在C/C++编程语言中,数组指针指针数组虽然听起来相似,但实际上有着明显的不同。 #### 指针数组 指针数组是指一个数组中的每一个元素都是指针类型的对象。这意味着声明`int *arr[4];`创建了一个含有四个整型指针数组。每个指针都可以独立地指向不同的内存位置[^1]。 ```cpp #include <iostream> using namespace std; int main() { int values[] = {10, 20, 30}; int *ptrArray[3]; ptrArray[0] = &values[0]; ptrArray[1] = &values[1]; ptrArray[2] = &values[2]; for (int i = 0; i < 3; ++i) { cout << "Value at ptrArray[" << i << "] is: " << *ptrArray[i] << endl; } } ``` 这段代码展示了如何初始化并遍历一个指针数组,其中每个元素都存储着不同类型数据的地址。 #### 数组指针 另一方面,数组指针指的是指向整个数组的一个指针。例如,对于一个具有固定大小的一维数组`int arr[4];`来说,可以通过如下方式定义一个指向它的数组指针:`int (*p)[4] = &arr;`。这里的关键在于圆括号包围的操作符(*)表明这是一个指向类型为`int [4]`的对象(即长度为4的整形数组)的指针而不是一个包含四次间接寻址操作的结果[^2]。 ```cpp #include <iostream> using namespace std; int main(){ int array[4] = {1, 2, 3, 4}; int (*pointerToArray)[4] = &array; // 访问第一个元素的方式之一 cout << "First element via pointer to array: " << (**pointerToArray) << endl; } ``` 此示例说明了怎样通过解引用(`*`)来访问由数组指针所指向的内容。注意这里的语法差异——为了使编译器能够识别这是对一个特定尺寸数组指针而非其他含义,必须使用额外的括号包裹星号(^2])。 总结而言,在处理这两种结构时需要注意它们各自的语法规则及其背后的概念意义;一个是用来保存多个指针值的容器,另一个则是用于定位一段连续分配的空间起点的位置指示器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值