指针表示数组的几种方式

1、一维数组及其指针表示:

一般会定义一个指针指向一个数组的首地址,定义完成之后,指针指向的地址和数组的首地址一致。

 当需要通过指针表示数组具体值的时候,需要在指针前加上*,表示取该地址所存放的具体值

 2、二维数组及其指针表示方式

2.1 定义指针表示二维数组

由于数组元素的地址是连续的,因此指针p连续向后取值即依次指向a[0][0]、a[0][1]、a[1][0]、a[1][1]、a[2][0]、a[2][1],这里6=3*2;

归纳一下,arr[i][j]可以表示为*(p+i*2+j),其中2是每行的元素个数,如:

arr[0][1]   >>   *(p+0*2+1)=*(p+1)

arr[1][1]   >>   *(p+1*2+1)=*(p+3)

arr[2][0]   >>   *(p+2*2+0)=*(p+4)

 2.2 定义指针数组表示二维数组

首先,我们必须搞懂二维数组的表示方式,在一维数组(这里指int类型)中,可以把一维数组看成一行数字,二维数组呢?不就是多行数字吗?所以二维数组就是多个一维数组组成的;

比如定义一个二维数组arr[3][2],可以看成三个一位数组arr1[2],arr2[2],arr3[2],每个数组包含两个元素,对应的数组名称分别是arr1=arr[0],arr2=arr[1]和arr3=arr[2],这三个一维数组就是二维数组 arr 的三个元素

在一位数组中,我们知道数组名称是数组的首元素地址,因此二维数组名称arr其实表示的是其首元素arr[0]的地址:

因此arr + i = & arr [ i ],arr [ i ] = *( & arr [ i ] ) = * ( arr + i )

 

同理,由于arr[ 0 ],arr[ 1 ]和arr[ 2 ]均是一维数组的名称,因此arr[ 0 ],arr[ 1 ]和arr[ 2 ]均可表示其对应一维数组的首元素地址,也就是arr [ i ] = & (arr[ i ]) [ 0 ] =  & arr[ i ] [ 0 ]:

一维数组arr[ 0 ] + j =  & arr[ 0 ] [ j ] ,arr[ i ] + j =  & arr[ i ] [ j ]

结合上面的式子,arr [ i ] = * ( arr + i )

因此得出:arr[ i ] + j =  & arr[ i ] [ j ] = * ( arr + i ) + j

 

因此& arr[ i ] [ j ] = * ( arr + i ) + j   ==>   arr[ i ] [ j ] = *( * ( arr + i ) + j )

如果定义一个指针数组(*p)[ 2 ],表示的是先定义一个指针p,且指针p指向的是包含两个元素的一维数组,这和二维数组arr[ i ] [ 2 ]中arr[ i ]表示的含义一致(arr[ i ]表示的是包含两个元素的数组)

于是令p = arr,则arr[ i ] [ j ] = *( * ( p + i ) + j )

这里需要注意的是,如果定义一个指针p(int *p;),直接令p = arr,则无法正常表示二维数组arr中的元素,这里比较一下地址,二维数组arr的首地址为2293280,arr + 2表示的是arr[ 2 ]的地址,为2293296:p2+2指向的地址也是2293296,但是p1+2指向的地址也是2293288,这是为什么呢?

这是因为指针p2是一个指针数组,每一个指针指向的都是一个包含2个元素的数组,因此p2+2指向的地址为229380+2×2×4=2293296,但是p1仅仅是一个普通指针,因此p1+2指向的地址为229380+2×4=2293288。

 如果需要定义一个普通指针表示二维数组,则可参考2.1 定义指针表示二维数组,以下为纠正后的表示:

 

 

### 数组指针的定义方法 数组指针指向数组指针,其本质是一个指针变量,指向某种特定类型的数组。在C语言中,可以通过以下几种方式定义数组指针: #### 1. 直接定义数组指针 使用括号将指针名和`*`结合,并在后面指定数组的大小。这种方式直接声明了一个指向数组指针。 ```c int (*pArr)[10]; // pArr 是一个指向包含10个整数的数组指针 ``` 这种定义方式强调了`pArr`是一个指针,它指向的是一个长度为10的整型数组[^1]。 #### 2. 使用 `typedef` 定义数组指针类型 通过 `typedef` 可以先定义一个数组类型,然后用该类型来声明指针变量,这样可以提高代码的可读性和可维护性。 ```c typedef int ArrayType[10]; // 定义一个数组类型,表示长度为10的整型数组 ArrayType *pArr; // pArr 是一个指向数组类型的指针,即数组指针 ``` 也可以合并为一行: ```c typedef int (*PArrayType)[10]; // 定义一个数组指针类型 PArrayType pArr; // pArr 是一个指向长度为10的整型数组指针 ``` 这种方法允许用户创建自定义的数组指针类型,便于多次使用。 #### 3. 利用数组类型定义数组指针 可以直接利用已有的数组地址来初始化数组指针。例如,对于一个二维数组,可以使用数组指针来遍历其元素。 ```c int a[3][5]; // 定义一个3行5列的二维数组 int (*p)[5] = a; // p 是一个指向长度为5的整型数组指针,并指向a的第一行 ``` 此时,`p`可以用于访问二维数组中的每一行数据,通过递增`p`(如`p++`)可以访问下一行[^3]。 #### 4. 使用数组指针访问数组元素 数组指针在访问数组时通常需要结合解引用操作符`*`,并通过索引访问具体元素。例如: ```c int arr[10] = {0}; int (*p)[10] = &arr; // p 指向 arr 这个数组 for (int i = 0; i < 10; i++) { (*p)[i] = i + 1; // 通过数组指针修改数组元素 } ``` 上述代码中,`(*p)[i]` 表示指针`p`所指向数组进行第`i`个元素的访问。 --- ### 示例代码 以下是一个完整的示例,展示如何使用数组指针访问数组内容: ```c #include <stdio.h> int main() { int arr[10] = {0}; int (*p)[10] = &arr; for (int i = 0; i < 10; i++) { (*p)[i] = i + 1; } for (int i = 0; i < 10; i++) { printf("%d ", (*p)[i]); } return 0; } ``` --- ###
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值