关于数组指针的一些认识

介绍

数组指针,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。例:int (*p)[10]; p即为指向数组的指针,又称数组指针。-百度百科

问题

在CSDN搜索“数组指针和指针数组”,点击人数最高的一篇文章中是这么写的

(*p)[n]:根据优先级,先看括号内,则p是一个指针,这个指针指向一个一维数组,数组长度为n,这是“数组的指针”,即数组指针;

一个一维数组与一个指针的关系在大部分情况下是等同的,都指向数组第0个元素的首地址,我们可以这样定义一个指针

int a[5] = {1,2,3,4,5}
int *p = a;

这样写编辑器不会报错,也能通过指针来读取数组中的元素。
但是对于数组指针,则不能这样写

int a[5] = { 1, 2, 3, 4, 5 };
int (*p)[5] = a;

报错如下,可见数组指针并不是一个指向一维数组的普通指针

E0144 “int " 类型的值不能用于初始化 "int ()[5]” 类型的实体

修改

对代码进行如下修改

#include <stdio.h>

int main()
{
    int a[2][5] = { { 1, 2, 3, 4, 5 },{ 6, 7, 8, 9, 10} };
	int(*p)[5] = a;
	printf("%d\n", **p);
	printf("%d\n", p[0][0]);
	printf("%d\n", a[0][0]);
	printf("%d\n", **(p+1));
	printf("%d\n", p[1][0]);
	printf("%d\n", a[1][0]);
}

输出:
1
1
1
6
6
6

可见,数组指针p对应的是一个二维数组,因此p应该是二维数组指针

p+1则向右移动了1行,也就是移动了5,**(p+1)对应的是a[1][0]

因此,p指向的是数组的的行数,p 指向的数据类型是 int [4],也就是说,p+1 会使得指针指向二维数组的下一行,p-1 会使得指针指向数组的上一行。

*(p+1)单独使用时表示的是第 1 行数据,有些编译器会转换为第一行数据的首地址,有些不会,因此可能指向一个无意义的数。

如果想访问二维数组的每个数据该如何操作呢?
使用*(*(p+x)+y)即可,x为行数,y为列数。亦可以使用p[x][y],效果相同。

题外话:在c语言中,a[n]会被编译器自动转换为*(a+n),n[a]和a[n]是没有区别的,只是一般没有人这样用。

总结

数组指针实质上是二维数组指针,如果说它指向一维数组也没错,但这个一维数组的元素又是多个一维数组。这和二维数组是类似(或者根本就是一样?我不敢打包票)的。
二维数组也能理解为多个一维数组。a [2][3]可以理解为a[2]这个一维数组中有两个元素,这两个元素其实也分别是一维数组,他们是匿名的,步长为3。

免责声明

本人也只是个初学者,如果你用我的观点跟老师/大佬抬杠被打爆了,请不要找我
如有错误,烦请各位大佬指正!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值