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
- b 是一个指针
- 该指针指向一个函数
- 该函数返回值是 char 类型的指针,并且有两个参数一个是 char,一个是 int 类型的指针
同理再看 c
- c 是一个数组
- 数组中的元素是指针
- 指针指向的是函数
- 函数的返回值是 char 类型的指针,并有一个参数是 int 类型
动态内存分配
先有一个规则:C 语言是面向过程的。
函数:声明---->定义----->使用
变量:定义---->划分占有内存大小---->使用
函数的好理解,变量的就拿使用最多的字符串来理解
C 中字符串有两种定义方式:
char str[] = "HELLO WORLD";
char *str = "HELLO WORLD";
这种在定义时直接赋值相当于完成了定义一个 char 类型的数组或指针 str,并划分了 12 个字节的内存空间。
定义和划分内存的工作是由 "" 来完成的。C 语言中双引号,会完成以下步骤
- 在字符串末尾添加 /0 字符
- 获取字符串的长度,并划分内存
- 将该字符串的首地址赋值给 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
在编译下
成功!
- 作者:shuouyang
- 链接:https://notion-tree.vercel.app/article/81bce1e5-bab6-4b4b-b864-95fdf9536504
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。