指针类型的变量是存储“地址”的,这一点我相信大家都清楚。但有一点大家在学习的时候可能都忽视了,“地址”是要“绑定”一块空间的。比如:int x; int *p = &x; //p中存放的是变量x的存储地址,该地址“绑定”的空间就是sizeof(int)!
有了以上的认识,再来看楼主的问题(当然,实际上楼主的问题是不应该这样问的:))。
问:若有一个指针**P要指向数组指针*a[5]时,是不是也像指向数组一样不用取址符,直接就是p=a?
答:1)首先要纠正一下, *a[5]是指针数组,而不是数组指针。(*a)[5]才是数组指针。
2)我们权且认为作者是问:如何定义一个**p指向指针数组*a[5]?
指针数组*a[5]中的每一个元素都是指针,因此,给p赋值的正确语句应该是:p = &a[i];
// 0<=i<=4
原因在于:a[i]中存放的是一重指针,&a[i]不正代表了“指针的存储地址”吗?
3)补充:楼主的 "p = a;"也是对的。因为a代表了数组的地址,而数组中元素存放的也是“地址”,而此时:a不就是“指针的存储地址”吗?只不过大家要去区分:a、&a、&a[0]这三个地址有什么区别?答案是:它们里面存储的地址是相同的,但地址“绑定”的单元可能不一样大!大家去执行一下下面的程序就知道了。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int **p =
NULL;
int b[5] = {1,2,3,4,5};
int *a[5]={&b[0], &b[1],&b[2],&b[3],&b[4]};
p = a; //此处编译器进行了隐式转换!内存发生了”有效截断“
printf("%x, %x, %x\n", a, &a, &a[0]);
printf("%d, %d, %d\n", sizeof(a), sizeof(&a), sizeof(&a[0]));
printf("%d\n", **p);
system("PAUSE");
return 0;
}