C语言中的指针声明
- 指针是一种对象类型,它指向另一种类型的函数或对象(可能还带有类型限定符,如
const/volatile)。指针也可以不指向任何对象,这种状态由特殊的 空指针值表示。
语法格式:类型说明符序列 * 类型限定符 (可选,例如const、volatile) 声明符(即变量名,例如p、event_queue)
- 在指针声明的语法中,类型说明符序列指定了指针所指向的类型(可以是函数类型或对象类型,也可以是不完整类型)。
示例:float *p;表示p是一个指向float的指针,float就是类型说明符序列。
示例:float **pp;表示pp是一个指向float类型指针的指针,即指针的指针。
示例:int (*fp)(int);表示fp是一个指向函数的指针,该函数的类型是int(int),即函数的返回值是int类型,函数参数的类型是int。
- 出现在
*与标识符(或其他嵌套声明符)之间的限定符,用于限定正在声明的指针的类型。
示例:cp是一个指向非常量int类型的常量指针:
intn;int*constcp=&n;示例:cp是一个指向常量int类型的非常量指针
intn;constint*cp=&n;- 指向对象的指针
指向对象的指针,可以用对一个对象类型(可以是不完整类型)的表达式应用取地址运算符 & 的结果来初始化。
示例:指向int类型
intn;int*cp=&n;示例:指向int数组的指针
inta[10];int(*ap)[10]=&a;- 指向函数的指针
指向函数的指针可以用函数的地址来初始化。由于存在 “函数到指针” 的隐式转换,取地址运算符 & 是可选的。
示例:下面两条指针语句效果相同
voidf(inta){}intmain(){void(*pf1)(int)=f;void(*pf2)(int)=&f;return0;}指向void的指针
任何类型的对象指针,都可以隐式转换为指向 void 的指针;反之亦然。
示例:
inta;int*p=&a;void*pv=p;- 所有类型的指针都有一个特殊值,称为该类型的 “空指针值”。值为空的指针不指向任何对象或函数。要将指针初始化为空,或给现有指针赋值为空,可以使用空指针常量(如 NULL,或任何值为 0 的整数常量)。
示例:
#include<stdio.h>intmain(){int*p1=NULL;int*p2=0;return0;}点击NULL进去,可以看到它的定义:
- C语言中的
*属于声明符的一部分,而不类型的一部分。
示例:下面代码中p1是指向int型的指针;而p2是int类型,不是指针:
int*p1,p2;等效于下面的代码:
int*p1;intp2;下面来验证下p1是指针,而p2不是指针:
#include<stdio.h>intmain(){int*p1,p2;printf("sizeof(p1) = %zu\n",sizeof(p1));printf("sizeof(p2) = %zu\n",sizeof(p2));return0;}运行输出,可以看到它们占用的字节数不同:
如果要将p1和p2都定义为指针,可以改为下面这样:
#include<stdio.h>intmain(){int*p1,*p2;printf("sizeof(p1) = %zu\n",sizeof(p1));printf("sizeof(p2) = %zu\n",sizeof(p2));return0;}运行输出:
或者,更清晰一些,将定义分开不同的行:
#include<stdio.h>intmain(){int*p1;int*p2;printf("sizeof(p1) = %zu\n",sizeof(p1));printf("sizeof(p2) = %zu\n",sizeof(p2));return0;}运行结果:
