C语言中指针的用法
2014-03-08 00:00
274 查看
摘要: 关于c语言指针的取地址的问题 int a[5],(int *)&a 与 a 的区别
代码的输出是: 2, 5
这是C语言里一个比较容易搞混的地方,很多人直接把数组名当成数组第一个元素的地址,其实两者间有一点差异的。大多情况下,数组名确实可以当做数组第一个元素的地址,但这只是因为当数组名在表达式中使用时,被转换成了第一个元素的地址。
我记得没错的话,在两种情况下,数据名必须被当成具有数组类型的变量: 一个是对数组取地址得到的是指向一个数组的指针,第二是 sizeof(a) 的得到的是数组所占的字节数。
所以对于(&a + 1), &a得到的是数组指针,数组指针加一就等于 (char*)&a + sizeof(a), 得到的的是一个紧靠数组后的一个地址,然后对这个地址进行类型转换成int 的指针,对这个指针加一就得数组最后一个元素的地址。
正是因为数组这种特点,比较好的做法是用 &a[0] 来表示数组第一个元素的地址。
其实函数名和数组一样具有这种特点,例如对于函数 void func(), 一般情况下 &func 和 func 是可以互用的。
记住: 取地址符 & ,是把符号后面元素的整个对象作为一个整体, 深刻理解 &a[0] 与 &a
输出最终结果是一样的!
#include<stdio.h> void main( void ) { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf("%d,%d",*(a+1),*(ptr-1)); return; }
代码的输出是: 2, 5
这是C语言里一个比较容易搞混的地方,很多人直接把数组名当成数组第一个元素的地址,其实两者间有一点差异的。大多情况下,数组名确实可以当做数组第一个元素的地址,但这只是因为当数组名在表达式中使用时,被转换成了第一个元素的地址。
我记得没错的话,在两种情况下,数据名必须被当成具有数组类型的变量: 一个是对数组取地址得到的是指向一个数组的指针,第二是 sizeof(a) 的得到的是数组所占的字节数。
所以对于(&a + 1), &a得到的是数组指针,数组指针加一就等于 (char*)&a + sizeof(a), 得到的的是一个紧靠数组后的一个地址,然后对这个地址进行类型转换成int 的指针,对这个指针加一就得数组最后一个元素的地址。
正是因为数组这种特点,比较好的做法是用 &a[0] 来表示数组第一个元素的地址。
其实函数名和数组一样具有这种特点,例如对于函数 void func(), 一般情况下 &func 和 func 是可以互用的。
记住: 取地址符 & ,是把符号后面元素的整个对象作为一个整体, 深刻理解 &a[0] 与 &a
#include<stdio.h> int main() { int a[5]={1,2,3,4,5}; int *ptr= (int *)(int *)(&a); int *ptr2 = a; //数组a的首个元素的地址,相当于 &a[0]--->把单个元素作为对象 int *ptr3 = (int *)&a; //数组a的指针,把整个数组a作为对象, (int *)(&a+1)代表把整个数组作为对象,指针向后移动,代表的是a[5]的地址 printf("*ptr=%d *ptr2=%d ptr3=%d\n",*ptr,*ptr2,*ptr3); }
输出最终结果是一样的!
相关文章推荐
- C++调用C#编译的动态连接库
- C++学习[1] 字符串
- C++笔试问题总结
- 使用Beaglebone Black的I2C (二)——使用C语言和i2c-dev驱动
- C++的头文件和实现文件分别写什么(转)
- 学习C语言基本思路与参考书籍
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之八 - 打造自己的单元测试框架
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之六 - 运行参数
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之五 - 死亡测试
- windows下的C++ socket服务器(4)
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化
- C++调试小助手
- C++ 内敛函数
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之三 - 事件机制
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之二 - 断言
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之一 - 初识gtest
- 深入理解gtest C/C++单元测试经验谈
- 搭建c/c++eclipse工具链
- 下三角形的一些思考