- int *p[n];- 这是一个指针数组。具体来说,p是一个包含n个元素的数组,每个元素都是一个指向整型数据(int)的指针。
- 你可以想象成有一个数组,数组的每个位置都存储了一个地址,这些地址指向整型变量。
 
- 这是一个指针数组。具体来说,
- int (*p)[n];- 这里,p是一个指针,它指向一个包含n个整型数据的一维数组。
- 你可以想象成 p是一个地址,这个地址指向了一个数组的开始位置,而这个数组包含了n个整型数据。
 
- 这里,
- int *p();- 这里,p是一个函数,它返回一个指向整型数据的指针。
- 当你调用 p()时,它会返回一个地址,这个地址指向某个整型变量。
 
- 这里,
- int (*p)();- 这里,p是一个指针,它指向一个返回整型数据的函数。
- 你可以想象成 p是一个地址,这个地址指向了某个函数的开始位置,而这个函数会返回一个整型值。
 
- 这里,
为了更好地理解这些概念,你可以尝试编写一些简单的程序来演示它们的使用。比如:
对于第一个例子(指针数组):
| #include <stdio.h>  | |
| int main() {  | |
| int a = 10, b = 20, c = 30;  | |
| int *p[3]; // 指针数组,可以存储3个指向int的指针  | |
| p[0] = &a;  | |
| p[1] = &b;  | |
| p[2] = &c;  | |
| for (int i = 0; i < 3; i++) {  | |
| printf("%d\n", *p[i]);  | |
| }  | |
| return 0;  | |
| } | 
对于第二个例子(指向数组的指针):
| #include <stdio.h>  | |
| int main() {  | |
| int arr[3] = {10, 20, 30};  | |
| int (*p)[3]; // 指向包含3个int的数组的指针  | |
| p = &arr; // 指向arr数组  | |
| for (int i = 0; i < 3; i++) {  | |
| printf("%d\n", (*p)[i]);  | |
| }  | |
| return 0;  | |
| } | 
以此类推,你可以尝试编写程序来演示其他两个例子的用法。