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\n",  p1);

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

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

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

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

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

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

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

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

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

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

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

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

getchar();

return 0;

}

运行结果可能是:

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

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

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

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

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

最新文章

  1. LogBack简易教程
  2. Cannot create an instance of OLE DB provider &quot;OraOLEDB.Oracle&quot; for linked server &quot;xxxxxxx&quot;.
  3. .NET 强引用与弱引用
  4. Android --日期控件使用并显示选择的日期
  5. centos yum 使用笔记
  6. 关于JS中的JSON
  7. C语言宏高级用法 [总结]
  8. JAVA 下拉列表和滚动条
  9. http_load测试Web引擎性能
  10. 【BZOJ】【1076】【SCOI2008】奖励关
  11. python读取Excel
  12. 棒!使用.NET Core构建3D游戏引擎
  13. Hessian服务端和客户端示例
  14. 浅析c++和c语言的enum类型
  15. log4j java项目中的配置
  16. FFmpeg开发实战(六):使用 FFmpeg 将YUV数据编码为视频文件
  17. JavaScript深拷贝
  18. 全栈开发工程师微信小程序-上(下)
  19. 老项目用webpack中文乱码问题解决记录
  20. 将Azure WebSite(应用)集成到虚拟网络

热门文章

  1. ActiveMQ 消息存储
  2. 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它
  3. 185. Department Top Three Salaries
  4. Mac终端ls显示文件名为彩色
  5. 如何关闭 window10 自带的杀毒软件
  6. mysql 自增长 AUTO_INCREMENT
  7. SMOTE RF MLP demo use cross_val_score to find best argument 处理不平衡数据的demo代码 先做smote处理 再用交叉验证找到最好的模型参数 实践表明MLP更好
  8. 剑指offer--5.变态跳台阶
  9. python3 xrange报错
  10. THUWC2017