今天主要讲些指针数组,和数组指针相关知识
希望大家今天也要开心呀!
指针数组:
首先是一个数组,数组的元素都是指针,数组所占的字节数由数组本身大小决定。、
数组可以存放任何类型(整形,浮点,结构,位段,指针,数组 等)
数组指针:
首先是指针,指向一个数组,在32位下是4个字节,指向的数组占字节数未知
指针可以指向任何合法的类型变量。
int *p1[10] ;
int(*p2)[10] ;
以上面例子分析:
首先** [ ]的优先级高于 *** 所以,p1先和 [ ]结合是数组,然后类型是数组的类型int *。
p2是先和 * 结合变成指针,指向一个数组,数组的类型是 int [ 10 ]。
稍微进阶下呢?
int(*p3[7])[10];
int(*(*p4)[8])[10];
这下看起来有些复杂,但是本质是没有变,我们分析下:
首先,p3先和数组结合,是数组,那么就要放内容,类型就是int () [10],这个类型是一个指针数组,所以这个就是一个数组指针数组,数组元素个数是7个,数组元素类型是int () [10]。
p4先和指针结合,是指针,指针就要有指向,指向一个数组,数组存放的是一个数组指针,所以这个是一个数组指针数组的指针,指针先指向了一个数组指针,数组指针的内容是一个数组。
这下面可以无线套娃啦,但是一般情况下,不会使用到这一步,只要能看懂就好了。
扩展:
这里有个C语言的奇怪的地方,正常来说,一个变量是 类型 + 变量名 = 值。整形,浮点,指针都满足,但是放到数组就不一样啦!
看个例子:
int a = 10;
double b = 11.1;
int * c = NULL;
double *d = NULL;
int arr[10] = { 0 };
double brr[10] = { 0 };
一般的类型,都在左边,而数组就不一样,但是都满足把变量名去掉就是类型。
所以我们如果想把数组的类型也像其他一样,那么我们使用typedef进行类型重名。
这样看就符合常理了,但是使用typedef是一种封装,不建议过度使用。
数组中的数字是类型的一部分吗?(int [10]中的10)
这样通过调试来看,数组中[ ]数字是类型的一部分,还因为&a之后没有警告的就放入b中,这就证明了&a的类型和指针变量b的类型一样,如果数字不一样可以放进去吗?
可以放进入,但是有警告。
这就和另一点知识相关啦,关于地址的强制转换。
强制类型转化:只改变了看待数据的方式,而不是数据类型发生变化。
比如字符串“12345”,如果转化为整数12345,是不能通过强转来实现的,那么这个数据是发生变化啦。在比如int a = 97,你想把它表示为 字符 'a',那么只需要用char类型的数据来看就行啦,不用更改数组本身。
那么对地址进行强转呢?
实际上地址的值没有变,只改变访问的字节数,或者说和指针强转后的访问步长有关。
下期预告:
下期讲解二维数组相关知识。
下期更精彩!!!
版权归原作者 沙漠下的胡杨 所有, 如有侵权,请联系我们删除。