0


指针的深度解刨《五》

今天主要讲些指针数组,和数组指针相关知识

希望大家今天也要开心呀!

指针数组:

首先是一个数组,数组的元素都是指针,数组所占的字节数由数组本身大小决定。、

数组可以存放任何类型(整形,浮点,结构,位段,指针,数组 等)

数组指针:

首先是指针,指向一个数组,在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类型的数据来看就行啦,不用更改数组本身。

那么对地址进行强转呢?

实际上地址的值没有变,只改变访问的字节数,或者说和指针强转后的访问步长有关。

下期预告:

下期讲解二维数组相关知识。

下期更精彩!

标签: c语言 c++

本文转载自: https://blog.csdn.net/m0_64770095/article/details/124238246
版权归原作者 沙漠下的胡杨 所有, 如有侵权,请联系我们删除。

“指针的深度解刨《五》”的评论:

还没有评论