天天看点

c语言中指针用法初级,C语言中指针的用法

#include

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

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);

}

输出最终结果是一样的!