type
status
date
slug
summary
tags
category
password
icon
😀
C 语言要点分析
 

函数指针

C 语言中最变化莫测的就是指针了,话不多说先来个基础版的指针
a,b,c,d 都表示什么?
💡
a 表示指向字符的指针和 b 表是 char 类型的数组这个很好理解
c 和 d 呢?
💡
首先得搞清楚 [] 和 * 的优先级,[] 的优先级比 * 高。
所以 c 先是一个数组,数组的元素的类型是指向 char 的指针类型。
d 就好理解了,d 先是一个指针,指向另一个指针,而该指针指向 char 类型。
好了,入门了?那高阶的来啰
那这三个 a,b,c 又是啥子嘞
💡
a 很容易,一个函数的声明,该函数返回一个 char 类型的指针,两个参数是一个 char类型的指针,一个是 int
那 b,c 呢
💡
先看 b
  1. b 是一个指针
  1. 该指针指向一个函数
  1. 该函数返回值是 char 类型的指针,并且有两个参数一个是 char,一个是 int 类型的指针
同理再看 c
  1. c 是一个数组
  1. 数组中的元素是指针
  1. 指针指向的是函数
  1. 函数的返回值是 char 类型的指针,并有一个参数是 int 类型

动态内存分配

先有一个规则:C 语言是面向过程的。
函数:声明---->定义----->使用
变量:定义---->划分占有内存大小---->使用
函数的好理解,变量的就拿使用最多的字符串来理解
 
C 中字符串有两种定义方式:
  • char str[] = "HELLO WORLD";
  • char *str = "HELLO WORLD";
这种在定义时直接赋值相当于完成了定义一个 char 类型的数组或指针 str,并划分了 12 个字节的内存空间。
定义和划分内存的工作是由 "" 来完成的。C 语言中双引号,会完成以下步骤
  1. 在字符串末尾添加 /0 字符
  1. 获取字符串的长度,并划分内存
  1. 将该字符串的首地址赋值给 str
然而在实际使用中往往都是提前定义变量,不知道最终的值的大小,后面赋值时才使用 sizeof() 来确定占用内存的大小。
所以常用方法是

条件编译

先看三个文件
头文件 file_1.h
头文件 file_2.h
运行函数 mian.c
看似没毛病,编译试试
为啥子嘞?
先看看 #include 这个宏的作用
就是在编译时把文件的中代码复制到这个源文件中。知道了后在看下前面的三个文件,
file_1.h 中声明并定义了一个方法 my_printf1
在 flie_2.h 中先 #include "file_1.h",是不是相当于 file_2.h 中也定义了my_printf1,之后声明定义了一个方法 my_printf12
在 main.c 中同时 #include "file_1.h" 和 #include "file_2.h",那 mian.c 中就相当于定义两个 my_printf1 方法。所以导致编译不通过。
那怎么解决呢
首先,问题是 file_1.h 头文件存在重复导入的问题,但是 C 语言中的库这么多每个都或多或少依赖于其他库,在使用中难道一直看到底,排查一遍吗?
不妨看看 C 语言标准库中常用的 string.h 是怎么解决这个问题的。
我们从中提取出
看名字大致能猜到如果没有定义才定义这个头文件。这样如果别的头文件中导入了该库,预编译时就就会排查下该库中是已经导入了该库,没有导入就定义该库,导入了就结束。
那我们去修改下 file_1.h
在编译下
成功!
 
 
 
 
基础-小知识Compose-高级
Loading...
shuouyang
shuouyang
android开发 ReactNative开发 小程序开发
最新发布
AOSP 环境搭建
2025-3-29
View 绘制流程-源码解析
2025-3-12
HTTP
2025-3-4
JVM 虚拟机
2025-2-28
蓝牙-BLE-基础
2025-2-28
从 OkHttp 的原理来看 HTTP
2025-2-19
公告
🎉热点信息🎉
--- 1 ---
Jet Brains 推出新的跨平台支持 Kotlin MultiPlatform
--- 2 ---
新的小巧便捷的依赖注入框架 Koin
--- 3 ---
新一代 API 查询语言 GraphQL