易混淆指针区分
1.指针数组
int *a[10]; // 数组中有10个整型的指针变量
2.数组指针
int (*a)[10]; // 数组指针变量,是指针变量,占4字节,存放地址编号
指向一个数组,+1的话,指向下一个数组。
3.二级指针
int **p; //指针的指针,保存指针变量的地址
常见用法1:
int **p;
int *q;
p = &q;
常见用法2:
int **p;
int *q[10];
分析:q是指针数组的名字,是指针数组的首地址,是q[0]
的地址。q[0]是int *
类型的指针。
所以q[0]
指针变量的地址,是 int **
类型的。
#include <stdio.h>
void fun(char**p)
{
int i ;
for(i=0;i<3;i++)
{
printf("%s\n",p[i]); // *(p+i)
}
}
int main()
{
char *q[3]={"hello","world","China"};
fun(q);
return 0;
}
运行结果:
4.指针函数
int *f(void);
*注意:f没有用括号括起来,是个函数声明,声明这个函数的返回类型是 int *
类型的。
5.函数指针
int (*f)(void);
注意 f用括号括起来了,*修饰·f
说明,f是个指针变量。
f是个函数指针变量*,存放函数的地址,它指向的函数必须有个int
类型的返回值,没有参数。
6.空类型的指针(void *)
对应类型的指针只能存放对应类型的数据地址
例如:cahr *
只能指向char
型的数据,int *
只能指向int
型的数据等。
void *
通用类型的指针,任何类型的指针都可以给void *
类型的指针变量赋值。
int *p;
void *q;
q=p; // 可以这样赋值,不用强制类型转换
void *
主要用于函数的参数和返回值的位置