对数组名取地址 a[ ],&a

摘要:
C语言规定数组名称表示数组的第一个地址,即元素0的地址。例如:inta[10],那么&a+1需要跨越10 int的长度进行详细分析-1 intarray[10];23内存集;4memset;第3行和第4行之间有什么区别吗?Array等同于Array[0](整数指针)。而array是指向int[100]的指针,int[100]是一个数组指针。其类型为int(*)[100]。当您使用数组指针变量接收其值时,您会发现它与整数指针数组和&array[0]非常不同。

C语言规定,数组名代表数组的首地址,也就是第0号元素的地址。所以a==&a[0]

但对数组名取地址时却要注意了,在理解“对数组名取地址”这一表达式的含义时一定要记住:数组名是“数组”这种变量的变量名

这样,&a就好理解了,它取的是“数组”这种变量的地址

&a+1自然也就要跨过整个数组,所有元素长度总和,这么长的一个长度。例如:int a[10],那么&a+1就要跨过10个int的长度

详细分析——

1 int array[100];

2

3 memset(array,  0, sizeof(array));

4 memset(&array, 0, sizeof(array));

第3行和第4行有什么不同吗?其实从效果上来说是一样的,但是这里要注意 array 和 &array 的类型是不同的。

array 相当于 &array[0],它们都是整型指针。而 &array 是一个指向 int[100] 的指针,这是一个数组指针,类型是 int(*)[100],当用数组指针变量来接收它的值时,你会发现它与整型指针array、&array[0]的巨大不同。

以下代码可以看出这个不同:

#include <stdio.h>

int main()

{

int array[100] = {0, 1, 2};

typedef int (*ARRAY)[100];

int  *p1 = array;//数组名代表第0号元素的地址(准确的说应该是代表第0号元素的指针):&array[0],第0号元素是一个整型变量

ARRAY  p2 = &array;

int  *p3 = &array;//实际上赋值符自动向下兼容,将&array转换为了一个整型变量指针:&array[0]

//或者可能是像空指针可以接收所有类型的指针值一样,各类型的指针都可以接收自己类型的数组指针,并完成兼容性转换,例如int型指针可以接收int数组的数组指针,并转换为int型指针;char型指针可以接收char数组的数组指针,并转换为char型指针。

printf("p1 = 0x%08d ",  p1);

printf("p2 = 0x%08d ",  p2);

printf("p3 = 0x%08d ",  p3);

printf("int=%dbyte ",sizeof(int));

printf("p1+1=0x%08d ",p1+1);

printf("p2+1=0x%08d ",p2+1);

printf("p3+1=0x%08d ",p3+1);

printf("p1[2] = %d ", p1[2]);

printf("p2[2] = %d ", p2[2]);

printf("p3[2] = %d ", p3[2]);

printf("(*p2)[2] = %d ", (*p2)[2]);

//printf("(*p1)[2] = %d ", (*p1)[2]);//这样编译错误

//printf("(*p3)[2] = %d ", (*p3)[2]);//这样编译错误

getchar();

return 0;

}

运行结果可能是:

对数组名取地址 a[ ],&amp;a第1张

 从上面的分析以及程序可以发现:

指针与地址其实还是有差异的,指针的属性中包含有地址这个概念,而且对于不同的指针,其地址概念却都是相同的,都是用一个数表示内存条上的某个位置。

但指针的属性中还有大小、距离的概念

大小——不同类型的指针,其指向的变量所占据的内存大小不同,即从内存条上的起始位置(即地址)开始,所占据的字节数不同。例如int占4个byte,char占1个byte

距离——不同类型的指针移动一个单位,其在内存条上移动的字节数不同。例如int型指针+1则移动4个byte,char型指针+1则移动1个byte,数组型指针+1则移动许多许多个byte

免责声明:文章转载自《对数组名取地址 a[ ],&amp;amp;a》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇精通 Oracle+Python 事务和大型对象[转]Kindeditor图片粘贴上传(chrome)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

golang-指针,函数,map

指针普通类型变量存的就是值,也叫值类型。指针类型存的是地址,即指针的值是一个变量的地址。一个指针只是值所保存的位置,不是所有的值都有地址,但是所有的变量都有。使用指针可以在无需知道变量名字的情况下,间接读取或更新变量的值。 获取变量的地址,用&,例如:var a int 获取a的地址:&a,&a(a的地址)这个表达式获取一个指向整型...

Linux内核调试方法总结之栈帧

栈帧 栈帧和指针可以说是C语言的精髓。栈帧是一种特殊的数据结构,在C语言函数调用时,栈帧用来保存当前函数的父一级函数的栈底指针,当前函数的局部变量以及被调用函数返回后下一条汇编指令的地址。如下图所示:                         栈帧位于栈内存中,接下里我们用一个实例展示一下栈帧的入栈和退栈过程。  stackframe.c #incl...

MAC地址记录与重复检测系统

一、通信模块如WiFi、Zigbee都会有唯一的MAC地址,这些模块在出厂前需要一套系统来确保唯一性。 此套MAC地址记录与重复检测系统已经经过KK级的出货验证,难有漏网之鱼。 二、系统设计思路: 客户端程序读取模块MAC地址,然后去pass数据库中寻找是否已经存在,如果不存在,则将此MAC存到pass数据库中,显示PASS,如果已经存在,证明已经生产过了...

智能指针之 auto_ptr

  C++的auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理,该智能指针在C++11中已经被弃用,转而由unique_ptr替代,那这次使用和实现,就具体讲一下auto_ptr被弃用的原因,(编译平台:Linux centos 7.0 编译器:gcc 4.8.5 )   首先使用std::auto_ptr时,需要#include...

linux系统socket通信编程1

Linux下的Socket编程大体上包括Tcp Socket、Udp Socket即Raw Socket这三种,其中TCP和UDP方式的Socket编程用于编写应用层的socket程序,是我们用得比较多的,而Raw Socket则用得相对较少,不在本文介绍范围之列。 TCP Socket 基于TCP协议的客户端/服务器程序的一般流程一般如下: 它基本上可...

多线程中,ResultSet为空,报错空指针

最近在数据库查询数据时,由于数据量太大,使用了多线程,通过线程池建了好几个线程,然后调用了一个封装好的jdbc查询语句。 结果在多线程中,ResultSet报错空指针。 仔细查阅后,才发现多个线程访问了同一个connection,事务混乱,导致了空指针。 解决方法: 使用数据库连接池,这样一个线程各自使用一个connection,就不会有冲突了。...