今天 一个朋友 面试,
面试题如下:
int _tmain(int argc, _TCHAR* argv[])
{
int a[] = {1,2,3,4,5};
int * ptr = (int * ) (&a + 1);
printf("%d\t%d",*(a+1),*(ptr-1));
return 0;
}
我觉得 指针 只要 掌握 两方面信息 就 没什么 可难的了.
一是 指针变量 里 存放的 地址
二是 指针变量 的 基础 类型
了解 存放地址, 是 因为 所有 指针的 加减 都是 从 这个 地址 作为 基础的.
需要 了解 指针的 类型 ,是 因为 int 占用 4个字节,char 一个字节,float,double 8 个字节(具体 得看 编译器,目前指的是32位的编译器), 所以 指针 加减的 大小 也是 不同的.
了解 这些 就没什么 可难的了..
解析题目:
int * ptr = (int * ) (&a + 1);
谭浩强的 书里 说过 a = &a[0], 也就是 a 等于 第一个 变量的 地址. *(a+1) = a[1] = 2
&a 可以 理解为 指向 一个 数组 的 指针, &a + 1 的地址 就是 a[0+5] 的地址,
然后将 这个指针 强转成 int * , 就 又 变成 指向 int 的 指针, 这样 ptr -1 其实 就是 a[4], *(ptr-1) = a[4] 就是 5