C与C++中的函数与指针

用用就知道多厉害了,墙裂推荐这个将C语言声明翻译成口语的翻译器:C语言声明翻译器--在线版对表达式声明的理解float f,g;当对其求值时,表达式f和g的类型为浮点数类型(float)。float ((f));当对其求值时,表达式((f))的类型为浮点数类型(float)。float ff();表

用用就知道多厉害了,墙裂推荐这个将C语言声明翻译成口语的翻译器:C语言声明翻译器--在线版

对表达式声明的理解

float f,g;当对其求值时,表达式f和g的类型为浮点数类型(float)。 float ((f));当对其求值时,表达式((f))的类型为浮点数类型(float)。 float ff();表达式ff()求值结果是一个浮点数,也就是说,ff是一个返回值为浮点类型的函数。 float *pf;表达式*pf是一个浮点数,也就是说,pf是一个指向浮点数的指针。

float *g(), (*h)()()的优先级高于*,所以前者为float *(g());,即g是一个函数,该函数的返回值是一个指向浮点数的指针。所以,h是一个函数指针,返回值是一个浮点数。

(float (*)()) 类型转换符

int *f()==int *(f()) 函数调用操作符()的优先级高于间接访问操作符*。因此,f是一个函数,它的返回值类型是一个指向整型的指针。

int (*f)()

程序中的每个函数都位于内存中的某个位置,所以存在着指向那个位置的指针。

理解C语言声明的优先规则(自《C专家编程》)

序号 详情
A 声明从它的名字开始读取,然后按照优先级顺序依次读取。
B 优先级从高到低依次是:
1. 声明中被括号括起来的那部分
2. 后缀操作符:括号()表示这是一个函数,方括号[]表示为一个数组。
3. 前缀操作符:星号*表示“指向...的指针”

char * const *(*next)();

  1. (*next) next是一个指针 2.(*next)() next是一个指针,指向一个函数。这个函数接受的参数为空。
  2. *(*next)() next是一个指针,指向一个函数。这个函数接受的参数为空,返回的参数为一个指针。
  3. char * const *(*next)() next是一个指针,指向一个函数。这个函数接受的参数为空,返回的参数为一个指针,它指向的对象是一个指向char的常量指针。 即:declare next as pointer to function returning pointer to const pointer to char

其它表达式

表达式 解析
char *(*c[10])(int **p); declare c as array 10 of pointer to function (pointer to pointer to int) returning pointer to char
int (*(*foo)(void ))[3]; declare foo as pointer to function (void) returning pointer to array 3 of int
int (*f)(int *, int (*)(int*)); declare f as pointer to function (pointer to int, pointer to function (pointer to int) returning int) returning int
int (*f[5])(int *); declare f as array 5 of pointer to function (pointer to int) returning int
int (*(*f)[5])(int *); declare f as pointer to array 5 of pointer to function (pointer to int) returning int
int (*(*f)(int *))[5]; declare f as pointer to function (pointer to int) returning pointer to array 5 of int
int (*(*f)[5][6])[7][8]; declare f as pointer to array 5 of array 6 of pointer to array 7 of array 8 of int
int (*(*(*f)(int *))[5])(int *); declare f as pointer to function (pointer to int) returning pointer to array 5 of pointer to function (pointer to int) returning int
int (*(*f[7][8][9])(int*))[5]; declare f as array 7 of array 8 of array 9 of pointer to function (pointer to int) returning pointer to array 5 of int

Read more

Volcano 与 Kubernetes GPU 调度学习笔记

本笔记系统整理 Volcano 调度器、Kubernetes 调度框架、GPU Device Plugin、HAMi 等云原生 AI 调度领域的核心知识,适合用于学习、复习和工程实践参考。 目录 * 第一部分:Volcano 入门 * 1. Volcano 是什么 * 2. 安装与快速使用 * 3. 核心特性一览 * 第二部分:Volcano 整体架构 * 4. Volcano 解决的核心问题 * 5. 整体架构与数据流 * 6. 三层抽象模型 * 第三部分:Volcano 核心实现原理 * 7. Session 机制 * 8. Gang Scheduling 实现 * 9. Queue 与 DRF 公平调度

容器镜像(4):镜像的常用工具箱

容器镜像(4):镜像的常用工具箱

前几篇在讲多架构镜像时已经用过 skopeo 和 crane 做镜像复制,这篇系统整理这两个工具的完整能力,同时介绍几个日常操作镜像时同样好用的工具。 一、skopeo:不依赖 Daemon 的镜像瑞士军刀 skopeo 的核心价值是绕过 Docker daemon,直接与 Registry API 交互。上一篇用它做镜像复制和离线传输,但它的能力远不止于此。 1.1 安装 # Ubuntu / Debian sudo apt install -y skopeo skopeo --version # skopeo version 1.15.1 1.2 inspect:免拉取检查镜像元数据 docker inspect 需要先把镜像拉到本地,skopeo inspect 直接向 Registry

容器镜像(3):多架构镜像构建

容器镜像(3):多架构镜像构建

一、什么是多架构镜像 1.1 OCI Image Index 上一篇介绍了单平台镜像的结构:一个 Manifest 指向 Config 和若干 Layer blob。多架构镜像在此之上多了一层——OCI Image Index(也叫 Manifest List),是一个轻量的索引文件,把多个单平台 Manifest 组织在一起: $ docker manifest inspect golang:1.22-alpine { "schemaVersion": 2, "mediaType": "application/vnd.oci.image.index.v1+json", "manifests&

容器镜像(2):containerd 视角下的镜像

容器镜像(2):containerd 视角下的镜像

一、为什么需要了解 containerd 如果你只用 docker run 跑容器,从来不关心底层,那可以不了解 containerd。但如果你在用 Kubernetes,或者想真正理解"容器运行时"是什么,containerd 是绕不开的。 事实上,当你执行 docker run 的时候,containerd 早就在后台悄悄工作了——Docker 从 1.11 版本开始,就把核心运行时剥离出来交给 containerd 负责。 1.1 Docker 的架构演变 早期的 Docker(1.10 及之前)是一个"大一统"的单体程序:一个 dockerd