当前位置: 首页 > news >正文

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;}

运行结果:

http://www.jsqmd.com/news/754564/

相关文章:

  • 从LINQ to Collections:C# 13集合表达式与System.Linq.Expressions深度融合的5种高级配置路径
  • Windows 11终极清理工具:3步让你的电脑重获新生
  • QMCDecode深度解析:解锁QQ音乐加密文件的全面指南
  • 基于SSH隧道实现Cursor远程开发:原理、配置与Python环境搭建
  • 紧急预警:C++27标准草案Final Draft前最后窗口期!掌握这6个constexpr约束放宽特性,避免代码在C++28中彻底失效
  • ai辅助开发:让快马平台智能生成hermes飞书复杂列表优化方案
  • QT多线程实战:用QThread封装USBCAN收发,告别界面卡顿
  • 从MobileNet到MobileViT:苹果这篇论文如何用‘卷积思维’重新设计Transformer?
  • 【微软内部性能白皮书级实践】:Span<T>与Memory<T>选型决策树,12种IO/计算场景精准匹配
  • 智能体记忆系统:动态管理与进化机制详解
  • 从一次线上告警复盘:我是如何用stress和dd命令,定位到那台‘假空闲’的Linux服务器的
  • 拆开这台AI盒子,用高通QCS6490开发板FV01跑通你的第一个视频分析Demo
  • 私有化Helm Chart仓库ChartMuseum:架构、部署与生产实践
  • Centmin Mod环境下OpenClaw日志分析工具集成部署与实战指南
  • 3步终极解决方案:PCL2启动器Java环境配置完整指南
  • RGMII接口时序调试详解:为什么你的千兆网口总丢包?从原理到实战调整TX/RX Delay
  • TAPFormer:多模态融合点跟踪框架的技术解析与应用
  • 深入x86硬件层:手把手教你通过端口I/O在UEFI Shell中读取CMOS实时时钟(RTC)
  • 量子开源社区的社会技术健康挑战与优化策略
  • 视觉语言模型自训练评估框架解析与应用
  • WorkBuddy 自带的 replace_in_file 工具能实现对 MD 文件的修改操作
  • npm install卡在code128?可能是你的Git配置在“打架”!一份排查清单请收好
  • YOLOv5模型优化实战:手把手教你集成CBAM注意力模块(附完整代码与配置文件)
  • LoRA与对比学习在视频检索中的高效训练方案
  • AI智能体自动识别项目技术栈与技能推荐:autoskills原理与实践
  • 重塑经典宝可梦体验:Universal Pokemon Randomizer ZX完全指南
  • 基于注意力机制LSTM的温度预测系统设计与实现
  • 从MIPS汇编到C语言:手把手教你用Mars模拟器写一个简单的计算器程序
  • XLSTM:并行化LSTM架构革新,提升长序列建模效率与性能
  • ai辅助探索jdk 21新特性:一键生成虚拟线程与record实战代码