本帖最后由 hongwenjun 于 2024-11-16 11:28 编辑
指针声明指针是一种对象类型,它引用函数或另一种类型的对象,可以添加限定符。指针亦可以不引用任何内容,这通过一个特定的空指针值指示。
语法在指针声明的[color=var(--link-color)]声明文法中,类型说明符 序列代表所指向的类型(可以是函数或对象类型,可以是不完整类型),而声明符的形式为:* 属性说明符序列 (可选) 限定符序列 (可选) 声明符其中 声明符 可以是命名所声明指针的标识符,包括另一个指针声明符(这指示一个指向指针的指针):[C] 纯文本查看 复制代码 float *p, **pp; // p 是指向 float 的指针
// pp 是指向指向 float 指针的指针
int (*fp)(int); // fp 是指向类型 int(int) 为函数的指针
我们使用 GCC 把定义指针的 代码,使用命令 gcc pn.c -S -o pn.asm 编译成汇编代码从右边的 asm 文件可以看到,只有 main函数的 分配栈代码和返回值 a0
所以指针对象如果没有指向实际的 C语言数据类型,编译器并没有生成实际代码,只是申明指针没有指向实体,并没有意义。
接下来,我们再来使用指针,指向一个 int 类型的变量
[C] 纯文本查看 复制代码 int n;
const int * pc = &n; // pc 是指向 const int 的非 const 指针
// *pc = 2; // 错误:不能通过不带转型的 pc 修改 n
pc = NULL; // OK:pc 自身可修改
int * const cp = &n; // cp 是一个指向非 const 的 int 的 const 指针
*cp = 2; // OK:通过 cp 修改 n
// cp = NULL; // 错误:cp 自身不能修改
int * const * pcp = &cp; // 指向指向非 const 的 int 的 const 指针的非 const 指针
观察右边的汇编代码,现在申明的指针会有真实的汇编代码了,如同普通变量一下,申请了内存地址,然后把应用对象的地址,保存到存放指针变量的地址里.
在汇编层次来说,指针和C语言其他变量类如int一样,并没有特殊性,都是分配内存,存储数字。
|