数组指针的内存布局及实例

首先测试源代码如下:

#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了,而不是加一个数组单位了!


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值