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

原创 2012年03月29日 18:59:14

首先测试源代码如下:

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

二维数组:内存布局与指针

这篇文章主要是就二维数组的内存布局,以及在使用中与指针的关系,举了一些小例子用以解释说明

【c++基础】6.内存机制、指针、引用、动态数组及实例

本章从c++的内存机制入手,首先介绍堆栈等内存机制,然后介绍指针、引用这两种核心的地址操作手段,最后介绍数组以及动态数组,在学习数组这种用户自定义类型的同时,加深对指针和内存机制的了解。【一】内存机制...

【嵌入式开发】C语言 内存分配 地址 指针 数组 参数 实例解析

① void 和 void*区别 : void 限定参数 限定返回值 void* 任意类型指针; ② 内存分配 : 栈区 , 堆区, 全局区, 常量区, 代码区; ③ 指针和地址解析 ; ④ 指针和函...

C语言 内存分配 地址 指针 数组 参数 实例解析

指针简介 : 指针式保存变量地址的变量; -- 增加阅读难度 : 指针 和 goto 语句会增加程序的理解难度, 容易出现错误; -- ANSI C : American National...

数组指针、指针数组、地址的强制转换内存布局

1、指针数组 首先它是一个数组,数组的元素都是指针,数组占多少个字节由数组本身决定。它是“储存指针的数组”的简称。 2、数组指针 首先它是一个指针,它指向一个数组。在32 位系统下永远是占4 个字节,...

10、数组指针与指针数组(内存布局、理解、地址强制转换(题目))

1. 指针数组与数组指针的内存布局 指针数组:首先它是一个数组,数组的元素都是指针,数组占多少字节由数组本身决定                ...

数组和指针的实例和总结

  • 2010-10-10 17:33
  • 5.54MB
  • 下载

面向对象--多继承&派生类对象内存布局分析&各基类指针所指向的位置分析

如果C同时派生了基类A和基类B,那么C的对象的内存是如何分布的呢?基类指针pa和基类指针pb对这块派生类C对象的内存所存储的内容又做和解析?或者说pa和pb指向的地址是否是C对象的首地址呢? 1.继承...

实例分析用指针访问二维数组的几种方法

(2012-02-18 21:48) 分类: Array 之前对数组的概念一直没有理解透彻,只觉得数组名就是个常量指针而已,用法和基本的指针差不多。所以当我尝试用二级指针去访问...

c语言函数指针数组的简单实例

#include #include #include #include #pragma comment(lib,"ws2_32.lib") //显示系统当前时间 void f1(){ ti...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)