C语言指针的个人理解
程序员文章站
2024-03-26 11:07:23
...
一、指针的概念
操作系统(32位系统)给每个存储单元分配了一个编号,从0x00 00 00 00 ~off ff ff ff,这个编号咱们称之为地址
所以 指针就是地址
操作系统存储数据或者分配内存均是以字节为单位的,所以一个地址代表的是一个字节,它有8位bit位。
1、指针的长度
无论什么类型的地址,都是存储单元的编号,在32位平台下都是4个字节,
即任何类型的指针变量都是4个字节大小
2、指针变量
定义一个变量,这个变量的类型是指针类型,即在变量保存的是地址,则称为指针变量
简单来说:是个变量,是个指针变量,即这个变量用来存放-一个地址编号
3、指针自身的类型
对应类型的指针变量,只能存放对应类型的变量的地址
举例:整型的指针变量,只能存放整型变量的地址
指针类型有:
①基本类型指针:如字符指针、整型指针、浮点数指针等
②构造类型指针:如数组指针、函数指针、指针的指针、结构体指针等
4、指针指向的类型
这里要与指针自身的类型区分开,指针自身的类型是指指针变量可以什么类型的数据
而指针指向的类型指指针指向的地址中保存的内容是什么类型的数据。
二、常见指针类型原型
1、基本类型指针
char/short/int/long/float/double *p;
2、指针的指针
char/short/int/long/float/double **p;
3、数组指针
//实质是指针,指向的是有5个int类型元素的一维数组
int a[5];
int (*p)[5] = a;
4、函数指针
//实质是指针,指向的是一个有两个int型形参和一个int型返回值的函数
int fun(int,int); //函数声明
int (*p)(int, int) = fun;
5、结构体指针
//实质是指针,指向的是一个结构体
struct stu *p;
6、指针数组
//实质是数组,数组的元素是指针,int *类型的指针
int *p[10];
7、二维数组指针
//实质是指针,指向的是一个二维数组,
int a[5][10];
int *p[5][10] = a;
8、函数指针数组
//实质是数组,数组的元素的是指针,指针指向的是函数,函数有两个int型参数,一个int型返回值,
int fun(int,int); //函数声明
int (*p[10])(int, int);
三、指针类型判断及书写复杂指针的技巧
1、判断指针类型的技巧
看到代码,从左至右,找运算符优先级最高的开始以优先级顺序结合。
例如有如下定义:
int (*a[10])(int) ;
第一步:找优先级最高的
a[10] 数组
第二步:用一个符号表示上一步的表达式
p1 = a[10]
第三步:重复一二步
*p1 指针
p2 = *p1
int p2(int) 函数
第四步:所有写完之后重下向上读出基本类型,就是上述表达式的类型
函数 指针 数组
练习:
char* (*pType[5])(char *, const char *);
pType[5] 数组
p1 = pType[5]
*p1 指针
p2 = *p1
char *p2(char *,const char *) 函数
结果:函数指针数组
2、书写复杂类型的指针
根据题设描述,分析实质,从实质的上层依次往下写,遇到优先级冲突问题就加()。
题设:一个有10个指针的数组,该指针指向一个函数,该函数有一个整形参数,并返回一个整形数
第一步:分析实质
它是数组,有10个元素 a[10]
第二步:分析下一层实质,重复此步,直到写完
数组的元素指针 *(a[10])
指针的类型是函数指针
写出函数原型 int fun(int)
用上面的内容替换函数名: int (*(a[10]))(int)
第三步:省略不需要的括号 int (*a[10])(int)