int _tmain()
{
int x = 20;
int ia[10];
int (*pi)[10];
int *a[10]; //a是一个数组,数组中的每一个元素都是int * 类型的指针
int **arr[10]; //arr是一个数组,数组中的每一个元素都是int ** 类型的指针
int (**def)[10]; //def是一个二级指针,指向一个一维数组,数组中的每一个元素都是int。
int *(*gh)[10]; //gh是一个指针,指向一个一维数组,数组中的元素都是int *
int (*f[10])(); //f是一个数组,含有10个元素,每一个元素都是函数指针(参数为无,返回值为int)
int *((*b)[10]); //b是一个指针,指针指向一个一维数组,每一个元素都是一个int *类型的指针
int (*fun)(int); //fun是一个函数指针,参数为int 返回值为int
int (*(*F)(int,int))(int); //F是一个函数指针,参数为int,int,返回值为一个函数指针,这个函数指针的参数为int,返回值为int
/*首先来分解这些定义究竟是什么意思。
int ia[10]是个简单的数组,数组中的每一个元素都是int型整数,
int *a[10]是个数组,数组中每一个元素都事int型指针,
int (*pi)[10]是个指针,这个指针指向一个一维数组,数组中的每一个元素都是int型整数。
至于这些都是怎么判断出来的呢,其实里面有个规律,首先找到定义的变量名,而后从变量向右看,如int *a[10]首先找到变量名称 ‘a',而后看向 a 的右边是 [10],那么能够得出 a 是一个数组且
数组中有10个元素,而后再从变量往左看,a 的左边是 int *,那么赞成能够获得 a 数组中的元素类型都为int *,也就是都是int型指针,至此,能够得出结论,a是一个一维数组,数组中的每一个元素
都是一个int型的指针。
根据这个规律,一条一条来分析上面定义的各变量:
int **arr[10]; 首先找到变量名arr,而后看右边[10],肯定arr是个数组,再看左边int **,肯定数组中的元素都是int **型的二级指针。
int (**def)[10]; 首先找到变量def,而后看右边是个括号,括号优先级大于[],因此先看括号里面的(**def),首先找到括号中的变量def,而后看右边,右边没有内容,再看左边**,肯定def是个二级指针,而后再看括号外面,先看右边[10],是个数组,再看左边 int,肯定
def是一个二级指针,最终指向的是一个一维数组,数组中的元素都是int型
int *(*gh)[10]; 首先找到变量gh,gh在括号中,先看括号内的(*gh),gh右边没有内容,再看左边*,肯定gh是个指针,再看括号外面,右边是[10],肯定指针指向的是个数组,再看左边int *,肯定数组中的元素都是int型的指针
int (*f[10])(); 首先判断这个定义是一个函数指针的申明,先找到变量f,发现f在括号(*f[10])中,那先判断括号中的内容,先找变量f,再看右边是[10],肯定是个数组,再看左边*,肯定数组中的元素都是指针,再看全局,能够肯定每一个元素都是一个函数指针,这个函数指针
的参数是无类型,返回值是int型。
到这来咱们就会判断这些定义到底定义的是些什么内容了,那接下来的sizeof就好办了。
int len = 0;
len = sizeof a; //a是数组,长度就是 sizeof(int)*10 = 40
len = sizeof arr; //arr是数组,数组元素都是指针, sizeof(p)*10 = 40, (p表明指针,通常指针的大小都是4字节)
len = sizeof def; //def是指针,指针是大小是 4
len = sizeof gh; //gh是指针,指针长度为4
len = sizeof f; //f是数组,数组元素是指针,4*10=40
len = sizeof b;
len = sizeof fun;
len = sizeof F;
gh = &a;
b = &a;
for (int i=0;i<10;i++)
{
ia[i] = i+20;
a[i] = new int[10];
*a[i] = i;
arr[i] = &a[i];
}
pi = &ia;
def = π
(*(*def))[3] = 21;
*((*gh)[1]) = 133;
*((*gh)[2]) = 13;
return 0;
}