虎贲小队程序猿

get along

导航

指针和数组的那些难分难解问题

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 = &pi; (*(*def))[3] = 21; *((*gh)[1]) = 133; *((*gh)[2]) = 13; return 0; }

 

posted on 2015-09-15 11:59  jjssl  阅读(223)  评论(0编辑  收藏  举报