您的位置:首页 > 编程语言 > C语言/C++

C语言中指针的用法

2014-03-08 00:00 274 查看
摘要: 关于c语言指针的取地址的问题 int a[5],(int *)&a 与 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);
}


输出最终结果是一样的!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: