关于数组名与指针的再学习

一维数组:
这里我们定义一维数组和一些其他变量予以区分。

    char ar[10]={};

    char (*p)[10]=&ar;

    char *pt=ar;

    //1
    printf("%d \n",sizeof(ar));
    //2
    printf("%d %d %d %d \n",ar,*ar,ar+1,*ar+1);
    //3
    printf("%d %d %d %d \n",&ar,*&ar,&ar+1,*&ar+1);
    //4
    printf("%d %d %d %d\n",pt,*pt,pt+1,*pt+1);
    //5
    printf("%d %d %d %d %d %d\n",p,*p,**p,p+1,*p+1,**p+1);

我们定义一个开辟四个整型空间的一维数组ar。这里我信printf函数没有信监视器。

这里我们来看1行,sizeof(ar)得出来的值都应该是16(4*sizeof(int))。这里是数组名的第一个特殊处,对数组名使用sizeof计算时,计算整个数组的字节大小。

再看2行,这里所打印的四个值按顺序为
1、数组名的地址(char *类型)
2、对数组首元素取值,所以是0(初始化都为0)(char类型)
3、 数组下标为1的元素的地址(这里的ar表明为数组首元素的地址)(char *类型)
4、这里*ar是char类型1这里编译器认为是int型,所以两者相加为int型,用sizeof计算为4字节(int类型),结果是1

再看3行:
1、&ar是取数组名的地址,这个值还是数组名的地址,值一样(char[10]*)
2、先&ar取数组的地址,在*后就是数组名本身
3、&ar取数组的地址+1,加(sizeof(char)*10)的字节大小
4、*ar是取首元素类型char取&,是取首元素的地址,+1是走到了数组下标为1的元素的地址。
这里当对sizeof使用时有特殊表示。

再看4行
1、pt是一个整型指针存储数组首元素的地址
2、*pt是数组的第一个元素的值
3、pt+1是在数组下标为1的元素的地址
4、*pt+1是先取数组的首元素,char类型+1结果是int类型,结果是1

再看5行
1、p是指向一个开辟了10个int类型的数组,这里p指向数组的首地址。
2、*p指向数组的首元素的地址 (char星)
3、**p指向数组的首元素char类型
4、 p+1指向下一个数组的首地址
5、*p+1,这里是星p是数组的首元素的地址+1表明是数组下标为1的元素的地址
6、**p+1,这里星星p是取首元素是char类型+1的结果是1(int类型)

二维数组

int main()
{
    char ar[3][4]={};

    char (*p)[3][4]=&ar;

    char (*br)[4]=ar;
    //1
    printf("%d \n",sizeof(ar));

    //2
    printf("%d %d %d %d %d %d \n",ar,*ar,**ar,ar+1,*ar+1,**ar+1);
    //3
    printf("%d %d \n",&ar,&ar+1);
    //4
    printf("%d %d %d %d %d %d %d %d \n",p,*p,**p,***p,p+1,*p+1,**p+1,***p+1);
    //5
    printf("%d %d %d %d %d %d \n",br,*br,**br,br+1,*br+1,**br+1);
    return 0;
    return 0;
}

这里我们来看看这些显示出来的值都是什么:

我们来看1行所显示
1、数组名的一个特殊处,用sizeof时是,计算整个数组的字节大小
结果是12(无符号整型)

再来看2行
1、ar在这里是表示二维数组首元素的地址(首元素是一个一维数组)
2、*ar表示指向二维数组首元素一维数组的首元素地址
3、**ar表示二维数组首元素一维数组的首元素,char类型
4、ar+1这里加1是加了一个元素的字节大小,二维数组的元素是一维数组,这里就加了4字节。
5、*ar+1这里加1是加了一个char的大小
6、**ar+1这里是char类型与int类型的运算结果是1(类型int)

再来看3行
1、这里&ar表示的二维数组的地址
2、加1是加一个二维数组的大小,也就是加12字节

再看4行
1、这里的p也是一个数组名的特殊,这里p表示整个二维数组的地址
2、*p这里表示二维数组的首元素的地址
3、**p这里表示就是二维数组的首元素一维数组的首元素的地址
4、***p表示是char类型是二维数组的首元素一维数组的首元素
5、p+1这里表示加整个数组的大小
6、*p+1加的是二维数组的元素一维数组的大小
7、**p+1是加一个一维数组的元素大小一个char类型
8、***p是一个char类型加一个int类型结果是1(int类型)

这里看5行
1、这里br代表二维数组的首元素一维数组的地址
2、这里就表示一维数组的首元素的地址
3、这里就是char类型了
4、br+1这里加1是加一个一维数组的大小
5、这里加1是加一个char的大小
6、这里就是char类型数据加int类型数据结果是1(类型int)

数组指针,指针数组

    char *(*p)[3][4]=NULL;

    printf("%d %d %d %d %d \n",sizeof(p),sizeof(*p),sizeof(**p),sizeof(***p),sizeof(****p));

我们再来看看,我们定义了一个指针 该指针指向一个三个元素的二维数组,每个元素是4个元素的一维数组,每一个一维数组的元素是char*。
这里的显示
1、这里p的类型是(char*[3][4]*),指向一个指针类型的二维数组。
所以计算就是算指针,大小为4,若加1自然是加整个二维数组的大小
2、*p这里就是指向二维数组的首元素地址,由于是使用sizeof特殊处理按照整个数组大小来算结果是48,二维数组的首元素地址就是一维数组的地址,若加1其结果是加一维数组的大小
3、**p这里表示一维数组的首元素地址,使用sizeof特殊处理计算一维数组的大小,结果是16,若加1表示加一个一维数组的元素的大小。
4、**p这里就是一维数组的元素了,也就是char类型,sizeof计算就是计算指针,结果是4,加1也就是加一个指针的大小
5、***p这里就是一维数组的元素char类型所指向的char类型,计算就是算char,结果是1,加1就是char与int的加和计算

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值