C语言 | 数组指针与指针数组

目录:

- 指针数组

- 数组指针

- 两者比较


-指针数组

我们类⽐⼀下,

整型数组,是存放整型的数组,

字符数组,是存放字符的数组。

323bd86adc3a4f62abab6b7d6e108e01.png

那指针数组呢?是存放指针的数组。

指针数组的每个元素都是⽤来存放地址(指针)的。例如:

44b8c16b44154cc48f7387ccd5a64133.png

指针数组的每个元素是地址,⼜可以指向⼀块区域。

2.利用指针数组模拟⼆维数组

#include <stdio.h>
int main()
{
 int arr1[] = {1,2,3,4,5};
 int arr2[] = {2,3,4,5,6};
 int arr3[] = {3,4,5,6,7};
 //数组名是数组⾸元素的地址,类型是int*的,就可以存放在arr数组中
 int* arr[] = {arr1, arr2, arr3};//指针数组
    int i = 0;
 for(i=0; i<3; i++)
 {
    int j = 0;
   for(j=0; j<5; j++)
  {
    printf("%d ", arr[i][j]);
  }                //等价于  *(*(arr+i)+j)
 printf("\n");     //本质上为指针运算!
 }
 return 0;
}

d77a318b84a6402badc02a1a1ce5c192.png

 arr[i]是访问arr数组的元素,arr[i]找到的数组元素指向了整型⼀维数组,arr[i][j]就是整型⼀维数组中的元素。

上述的代码模拟出⼆维数组的效果,实际上并⾮完全是⼆维数组,因为每⼀⾏并⾮是连续的。


-数组指针

我们来类比一下

字符指针:char *   指向字符的指针

整形指针:int *    指向整形的指针

浮点型指针:float *   指向浮点型的指针

那数组指针应该是:存放数组的地址,能够指向数组的指针。

d3a8a8ccd9b446f197d1143f4ba3c444.png


--下⾯代码哪个是数组指针?

int *p1[10];   //1
int (*p2)[10]; //2

答案是第二个为数组指针 

解释:p先和*结合,说明p是⼀个指针变量,然后指向的是⼀个⼤⼩为10个整型的数组。所以 p是⼀个指针,指向⼀个数组,叫 数组指针。

这⾥要注意:[ ]的优先级要高于*号的,所以必须加上()来保证p先和*结合。

2.数组指针的初始化

如果要存放整个数组的地址,就得存放在数组指针变量中,如下:

int arr[10] = { 0 };
int(*p)[10] = &arr;

b20895ccd816465db000cd5ea6b3f957.png

 我们调试也能看到 &arr 和 p 的类型是完全⼀致的。

数组指针类型解析:

int (*p) [10] = &arr;
 |    |    |
 |    |    |
 |    |    p指向数组的元素个数
 |   p是数组指针变量名
 p指向的数组的元素类型

两者比较

a9fd1c16307345a4b263aa2c53461001.png

希望对大家有所帮助。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值