读书人

指针赋值 int a[五]={. .}, a 、amp;a[0]

发布时间: 2012-08-31 12:55:03 作者: rapoo

指针赋值 int a[5]={.... ...}, a 、&a[0]、 &a三者之间的区别 浅析 C/C++求职面试必备考点(五)

首先,来看代码:

#include <stdio.h>void main(){    int a[5] = {1, 2 ,3 , 4, 5};     int *m = (int *)&a[0];     printf("%d\n", *(m + 1));    int *p = (int *)&a;    printf("%d\n", *(p + 1));    int *q = (int *)(&a + 1);    printf("%d\n", *(q-1));    int *w = (int *)(&a[0] + 1);     printf("%d\n", *(w-1));    }
有三个要点:

1,注意上面我们说那么(int *)可有可无,但是当加了&后,在int *m = (int *)&a[0]这里,如果不加强制转换会报警,因为这里取了地址,最好强制转换一下!

2,(int*)(&a[0]) 和(int *)(&a),从打印m和p的值来看,貌似这两种操作是没有区别的,但其实并非如此!&a[0] = a,都是代表数组a的首地址,也就是a[0]的地址。但&a是整个对象,也就是a这个数组整体的首地址。紧跟其后的指针q的申明,&a + 1究竟是谁的地址呢?

我们要切记,对指针进行加1操作,得到是下一个元素的地址,而不是原有地址的数值直接加1,这点大家肯定都知道。假设类型为x,则加1后,指针向后移动sizeof(x),移动是以sizeof(x)为单位的!

我怎么越说越不明白了,其实就是a和&a[0]以及&a,三者的区别!

前两个是等价的。&a上面也说过了,把a看成一个整体,所以&a + 1是a下一个对象的地址,即&a + 1,以相对a或者&a[0]来说,移动了sizeof(a) = 5*4 = 20个字节,即这里指针q指向a[5]!所以*(q - 1)的值是5,也就是a[4] 的值。 为了对照区别,最后我取了(&a[0] + 1)来做对照,w在申明时指向a【1】,*(q-1)的值是1,也就是a[0]的值。

3,int *n = a 等价于 int *n = (int *)&a[0] ,从指向上来看也等价于 int *n = (int *)&a;

但 当有指针加减操作时,两者的结果绝不相同!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

如:int *n = (int *)(&a[0] + 1)绝不等于 int *n = (int *)(&a + 1)。




读书人网 >C++

热点推荐