数组与指针

来看看几个大头:

  1. 指针数组
    我们来看看他的定义:
    int * a[2]
    在上面的定义中,需要注意的是:[]的运算优先级比 * 高,a是一个数组,类型为int (*)[2],数组里面存放的是两个指向int类型数据的指针,或者说,里面的两个元素是两个指针,这两个指针指向两个int元素的数据;看下面的例子:
    在这里插入图片描述
    配合注释我们可以看到,的确如此。

  2. 数组指针
    同样的,我们来看看他的定义:
    int (*a)[2];
    和我们所知的一样,()的优先级最高,首先a是一个指针,指向大小为2的数组,因此这叫数组的指针,定义了一个指向2个元素的一维数组的指针。和 int a[2] ,一对比就可以分辨出,一个是a,他的类型为int [2],一个为 *a,也是int[2]。同样的,我们来看看下面的代码:
    在这里插入图片描述
    最终程序运行的结果如下:
    在这里插入图片描述
    值得注意的是,在等号的两边,也就是赋值号的两边,类型必须相同,且在“=“左边不能是常量,当等号两边的类型不一样时,可考虑用强制类型转换。此外,在定义完变量后,最好根据我们的实际需要将其初始化,养成一个好习惯。

有关一维数组,需要注意的是:
(1) 数组名表示首地址,如:
int a[5];
a表示数组的首地址。他的类型为int [5]。只有在定义初始化的时候,这个5才表示这个数组有5个元素,定义初始化后,再出现,a[5] ,他就表示数组中的第五个具体的元素了。
(2) 数组在内存中的地址是连续的,所以,当知道了数组的首地址,我们就可以访问的到他的全部元素了。

好啦,下面来看看二位数组:
有关二位数组,同样,我们需要注意的是:
(1) 数组名表示首地址,如:
int a[3][3];
a就表示的是数组名,为数组的首地址,用*p打印,在数值上,a、a[0]是一样的,但是他们的意义不一样:a的类型为int ( * )[3],而a[0]的类型为int *型。

(2) 二位数组,在逻辑上,我们可以把他当成一个行列二维的数组,依旧以上面定义的数组为例,即如下表示:
a[0][0] a[0][1] a[0][2]
a[1][0] a[1][1] a[1][2]
a[2][0] a[2][1] a[2][2]
在我们分析问题的时候,可以以这种方式思考问题,但是实际上,在内存中,它实际上还是和一维数组一样的,以行为单位,从左到右,从上到下一次展开。

(3) 一样的,我们依旧以上面的例子为例,a[0]、a[1]和a[2]依次表示数组中,第一行、第二行和第三行数组的首地址。即a[0]、a[1]和a[2]都是表示的地址。

(4) 我们先来看看下面的程序:
在这里插入图片描述
执行的结果如下:
在这里插入图片描述
上面代码中,需要注意的是,注释所说的地址偏移,是以元素类型为单位的。

  1. 有关指针和数组的关系
    (1) 概念上,数组为储存多个相同类型数据的集合。指针是一个变量,它存储的是其他变量的地址;

(2) 大小:数组的大小可以用sizeof(buf)/sizeof(数组元素类型)求
对于32位系统,用sizeof求指针的大小为:4,在64位系统中,用sizeof求指针的大小为:8;

(3) 数组在定义的时候,如char a[5];他的意义表示:定义了一个名字为a的数组,这个数组里面可以存放6个char类型的数据。只有在定义的时候,这个[6],表示的是数组的大小,因此可以这样表示:char a[5] = “LHSMD”;但是如果换成下面这样表示,就是错误的:
char a[5];
a[5] = “LHSMD”; //错误,这里的a[5]只表示数组中第五个元素
如果你想在定义后,再进行给数组添加元素,只能是一个元素一个元素添加了;一样我们现在看看指针的初始化,我们定义一个指针,可以这样:
char a[5];
char *p = a;
前面我们说,p是一个指针变量,他存放的是一个地址,*p则是取出存放进这个地址的值,而a为数组名,代表首地址,而赋值号两边必须类型一样,你这里把一个地址赋值给一个具体的值怎么也对了,这是初学者可能存在的疑问,其实,和数组定义初始化的时候一样的的道理,在定义初始化的时候,如上面的 char p = a;这里的只表示我的p是一个指针变量而已,并不是取地址的意思,也就是说,这里的其实是等价于:
char a[5];
char *p;
p = a;
所以,这是需要注意的地方。

(4) 我们可以借助指针来访问数组,其实我们只要记住一点,指针变量存放的是一个地址,加上“*“后,就是取变量地址里面的值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

all of the time

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值