zoukankan      html  css  js  c++  java
  • 数组指针的内存布局及实例

    首先测试源代码如下:

    #include <stdio.h>
    
    int main(void)
    {
    	char a[] = "abcd";
    	char (*p3)[5] = &a;
    	char (*p4)[6] = (char *)a;
    /* 	
    	p3 = &a;
    	p4 = a; */
    	
    	printf("p3 = 0x%x\n",(unsigned int)p3);
    	printf("p4 = 0x%x\n",(unsigned int)p4);
    	
    	printf("p3+1 = 0x%x\n",(unsigned int)(p3+1));
    	printf("p4+1 = 0x%x\n",(unsigned int)(p4+1));
    
    	return 0;
    }

    >gcc -Wall p3add1.c

    p3add1.c: In function 'main':
    p3add1.c:6:18: warning: initialization from incompatible pointer type [enabled b
    y default]


    ./a.exe
    p3 = 0x22ff43
    p4 = 0x22ff43
    p3+1 = 0x22ff48
    p4+1 = 0x22ff49


    printf语句最好写成printf("p3 = 0x%x\n",(unsigned int)p3);否则用gcc -Wall 选项编译的时候会出现下面的警告:

    p3add1.c:12:2: warning: format '%x' expects argument of type 'unsigned int', but
     argument 2 has type 'char (*)[3]' [-Wformat]


    至于 initialization from incompatible pointer type [enabled by default]这个警告,我也找不到解决方法,不知哪位高手可以提醒一下~谢谢!

    首先来看看p3是如何定义的.知道p3了,p4也就不难了:
    (*p3)[5]的有了(),()的优先级比[]高,“*”号和 p3构成一个指针的定义,指针变量名为 p3,int 修饰的是数组的内容,即数组的每个元素。数组在这里并没有名字,是个匿名数组。那现在我们清楚 p3 是一个指针,它指向一个包含5个int类型数据的数组,即数组指针。


    而&a的意思是取整个数组的地址,a的意思就是取数组首元素的地址。
    char (*p3)[5] = &a;
    char (*p4)[6] = a;
    这两个语句的意思就是:

    把整个数组的地址赋值给p3
    把&a[0]的值赋给p4。


    然后p3+1和p4+1后就是在p3和p4地址的基础上再加上相应的n个单位的偏移量(p3的n=5,p4的n=6),就得到了上述的结果.


    其实,数组a的大小并不重要,只要是个有效的数组即可。
    char (*p3)[5] = &a;
    char (*p4)[6] = a;
    这两个操作仅仅是把两个地址赋给两个指针变量。


    还有

    (unsigned int)(p3+1)
    后面的括号一定要加,不然就是unsigned int的数据加数字1了,而不是加一个数组单位了!

  • 相关阅读:
    LOJ6433 [PKUSC2018] 最大前缀和 【状压DP】
    [NOIP2017] 宝藏 【树形DP】【状压DP】
    51Nod1824 染色游戏 【Lucas定理】【FMT】【位运算】
    51Nod1778 小Q的集合 【组合数】【Lucas定理】
    LOJ6436 [PKUSC2018] 神仙的游戏 【FFT】
    LOJ6432 [PKUSC2018] 真实排名 【组合数】
    BZOJ5210 最大连通子块和 【树链剖分】【堆】【动态DP】
    LOJ2269 [SDOI2017] 切树游戏 【FWT】【动态DP】【树链剖分】【线段树】
    洛谷3707 [SDOI2017] 相关分析 【线段树】
    RBAC
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007740.html
Copyright © 2011-2022 走看看