指针
指针是基本数据类型的一种
指针的实质
指针不像其他数据类型一样有确定的类型.
指针变量和指针常量有确定的类型.
指针存储的是一个字节内存的地址.
指针不是一个字节内存的地址
指针包括地址和类型.
地址
类型
-
int * 型
-
int * * 型
-
char * 型
-
double * 型
-
struct a * 型
-
int ( * )[4]型
-
int ( * )fun(void)型
指针常量
-
将常量地址与具体的类型结合,就是一个指针常量
-
(int * )0x0000ffff
-
(int * * )0x0000ffff
-
(char * )0x0000ffff
-
(double * )0x0000ffff
-
(struct a * )0x0000ffff
-
(int ( * )[4] )0x0000ffff
-
(int ( * )fun(void) )0x0000ffff
指针变量
-
将标识符与具体的类型结合,就是一个指针变量
-
int * p; //p是一个指针变量,p的类型为int * 型
-
int * * p; //p是一个指针变量,p的类型为int * * 型
-
char * p;//p是一个指针变量,p的类型为char * 型
-
double * p;//p是一个指针变量,p的类型double * 型
-
struct a * p;//p是一个指针变量,p的类型struct a * 型
-
int ( * p)[4];//p是一个指针变量,p的类型int ( * )[4] 型
-
int ( * p)fun(void);//p是一个指针变量,p的类型int ( * )fun(void) 型
指针的分析
当我们关注一个指针常量时,我们关注以下几点
- 指针常量的类型
- 指针常量指向的目标类型
- 指针常量指向的目标的地址
当我们关注一个指针变量时,我们关注以下几点
- 指针变量的类型
- 指针变量存储的地址
- 指针变量指向的数据类型
- 指针变量的地址
如果说对于每一个指针你都能将以上几点分析清楚,那么指针你就学会了
作者声明
指针是一种非常重要的数据类型,非常灵活,正是由于这点,指针还是比较难学的,刚学的同学都不知道从哪里下手.
其他
函数指针
先上实例,再作分析
#include <stdio.h>
void myfun(void);
int main(void)
{
void (*pf)(void);
pf = myfun;
(*pf)();
pf();
return 0;
}
void myfun(void)
{
printf("hello world!\n");
}
第一种方法:(*pf)()
因为pf指向myfun函数,*pf就是myfun函数,因此表达式(*pf)()与myfun()一样。
从myfun和pf的声明中就能看出myfun和(*pf)是等价的。
第二种方法:pf()
因为函数名是一个指针,可以互换地使用指针和函数名,因此pf()与myfun()一样。
从pf的赋值语句中就能看出pf和myfun是等价的。
这是c发展过程的历史原因,代表两帮人的不同观点而已!
但,最关键的一点,c标准把这二者作为等价形式全部接受!!!