C语言指针问题,跪求高手解决一下,下列定义的含义

(1)int *p[3];
(2)int (*p)[3];
(3)int *p(int);
(4)int (*p)(int);
(5)int *(*p)(int);
(6)int (*p[3])(int);
(7)int *(*p[3])(int);
(8)void *p;
C语言指针的问题,请高手看一下这八个定义的含义,我翻看了好多的资料,还是有点不是太明白,回答的好,我追加分数,先谢谢了.....

(1)int *p[3]; // p是个数组,元素是指向整数的指针(int*) ,长度是3
(2)int (*p)[3]; // P是个指针,类型是int(*)[3];指向由3个整数组成的一维数组,可用一个第二维是3的二维数组的地址给它赋值
(3)int *p(int); // p是个函数,有一个int类型的参数,返回一个int*
(4)int (*p)(int); // p 是个函数指针,该指针可指向有一个int参数,返回int的函数
(5)int *(*p)(int); // p是个函数指针,该指针可指向有一个int参数,返回int*的函数
(6)int (*p[3])(int); // p是个数组,有三个元素,元素类型是指向有一个int参数,返回int的函数指针,
(7)int *(*p[3])(int); // p是个数组,有三个元素,元素类型是指向有一个int参数,返回int*的函数指针,
(8)void *p; // p是个void类型的指针 ,一般用来表示绝对地址,可指向任何对象
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-05-01
首先在你的前 7 个里面加入一个:
1. int *p[3];
2. int (*p)[3];
+. int p(int);
3. int *p(int);
4. int (*p)(int);
5. int *(*p)(int);
6. int (*p[3])(int);
7. int *(*p[3])(int);

把类型的 * 放在前面,将数组名/函数名加上括号,重新编号:
1. int* (p)[3];
2. int (*p)[3];
3. int (p)(int);
4. int* (p)(int);
5. int (*p)(int);
6. int* (*p)(int);
7. int (*p[3])(int);
8. int* (*p[3])(int);

可见:
1、2 声明的是数组,括号中代表数组名。
1 声明了名为 p 的数组,括号前面代表数组成员类型为 int *,即保存3个指针的数组。
2 声明了名为 *p 的数组,括号前面代表数组成员类型为 int,即保存3个 int。*p 表示这样的数组,p 自然就是指向这么一个数组的指针。

3、4、5、6、7、8 声明的是函数,括号中带代表函数名。
3 声明了参数为一个 int,返回值为 int 的函数名 p。
4 声明了参数为一个 int,返回值为 int * 的函数名 p。
5 声明了参数为一个 int,返回值为 int 的函数名 *p。*p 等同于3中声明的函数名,这里的 p 自然就是指向3中所声明函数的指针。
6 声明了参数为一个 int,返回值为 int * 的函数名 *p。*p 等同于4中声明的函数名,这里的 p 自然就是指向4中所声明函数的指针。
7 声明了名为 p 的指针数组,其中包含3个5中所声明的函数指针类型(括号前面 int 代表该数组元素内的函数指针所指向函数的返回值类型,与数组无关)。
8 声明了名为 p 的指针数组,其中包含3个6中所声明的函数指针类型(同上)。

用汉字写出来就是这么回事:
int 函数1(int); // 这是函数1声明,参数为 int,返回值为 int。
int* 函数2(int); // 这是函数2声明,参数为 int,返回值为 int *。
int (*指向函数1的指针)(int);
int* (*指向函数2的指针)(int);
int (*指向函数1的指针构成的指针数组[5])(int);
int* (*指向函数2的指针构成的指针数组[5])(int);
函数1和函数2的区别就是返回值不同,其他都一样。

最后一个 void *p; 表示任意类型的指针,该类型可直接赋任何指针类型值无需任何转换。
char ch = 'A';
int i = 0;
double f = 3.14;
long *pl = (long *)&i;
void *p;
p = &ch;
p = &i;
p = &f;
p = pl;
以上用法均正确,无需强制类型转换。本回答被提问者采纳
第2个回答  2012-05-02
(1)定义了一个一维指针数组p,他的每一个分量分别指向一个int型整数;
(2)定义了一个二级指针变量p,他是用来指向二维数组的,(*p)[3];中的3是它所指向的数组的列数,例如:int a[4][3],(*p)[3]; p=a;这样我们就可以通过p对a数组进行操作了,如:**p,*(*(p+1)+1);
(3)p是int型指针的函数,其有一个形参为int形;
(4)定义了一个指向函数的指针变量p,p所指向的函数返回值是int型,形参为int型;
(5)定义了一个指向函数的指针变量p,p所指向的函数返回值是int型指针,形参为int型;
(6)定义了一个指向函数的指针数组p,p中每一个元素都可指向一个返回值为int型,参数为int型的函数;
(7)(6)定义了一个指向函数的指针数组p,p中每一个元素都可指向一个返回值为int型指针,参数为int型的函数;
(8)p是个空类型指针,平可指向任何类型的对象。
第3个回答  2012-04-30
1. *p[3] 一个有3个元素的int型指针
2. 一个具有n行3列的数组 *p是第一行第一列 相当于 p[][3]
3. 定义一个函数,返回值为int型指针
4. 一个具有一个int型参数的返回int的函数的指针
5. p是返回int型函数的一个带int 型参数返回int指针的函数的指针
6. 一个指向3个元素的int型指针,每个元素是一个具有一个int型参数的函数的地址
7. 返回值为int型指针的一个函数,拥有一个(6)的指针。
8. 无类型指针,可以指向任何对象,用的时候需要用(类型名*)来强制转换