接上回:
一、C数组
C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个元素。数组中的特定元素可以通过索引访问,第一个索引值为 0。C语言还允许我们使用指针来处理数组,这使得对数组的操作更加灵活和高效。
数组的声明,初始化以及访问方法不再赘述,可参考菜鸟教程C语言数组部分。下面是C指向数组的指针。
二、C enum枚举
枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量,它可以让数据更简洁,更易读。定义枚举类型需要用到enum关键字,如下;
enum 枚举名 {枚举元素1,枚举元素2,……};
#include <stdio.h>
enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
int main()
{
enum DAY day;
day = WED;
printf("%d",day);
return 0;
}
输出结果为:
3
注意:第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。
在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的,所以按照 C 语言规范是没有办法遍历枚举类型的。
三、C指针
C语言的指针部分可以称得上是C语言的精髓之处了,所以说学习C语言的指针是尤为必要的。在C语言中,每一个变量都有一个内存位置,每一个内存位置都定义了可使用&运算符访问的地址,它表示了在内存中的一个地址。
指针也就是内存地址,指针变量是用来存放内存地址的变量。以下指针变量的声明示例:
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
C指针的算术运算:
指针的每一次递增,它都会指向下一个元素的存储单元;只针对每一次递减,它都会指向一个元素的存储单元;指针在递增和递减时跳跃的字节数取决于指针所指向变量数据类型长度,如int是4个字节。
C指针数组:
C 指针数组是一个数组,其中的每个元素都是指向某种数据类型的指针。指针数组存储了一组指针,每个指针可以指向不同的数据对象。(应该清楚数组指针和指针数组之间的区别。)
C指向指针的指针:
这部分内容在菜鸟教程下面看到一位前辈的笔记,如下:
在C语言中,指针能够传递给函数,也能从函数返回指针。
四、C函数指针与回调函数
函数指针:
函数指针是指向函数的指针变量。通常我们说的指针变量是指向一个整型、字符型或数组等变量,而函数指针是指向函数。函数指针可以像一般函数一样,用于调用函数、传递参数。下面是一个函数指针的应用实例:
#include <stdio.h>
int max(int x, int y)
{
return x > y ? x : y;
}
int main(void)
{
/* p 是函数指针 */
int (* p)(int, int) = & max; // &可以省略
int a, b, c, d;
printf("请输入三个数字:");
scanf("%d %d %d", & a, & b, & c);
/* 与直接调用函数等价,d = max(max(a, b), c) */
d = p(p(a, b), c);
printf("最大的数字是: %d\n", d);
return 0;
}
最后的输出结果如下:
请输入三个数字:1 2 3
最大的数字是: 3
回调函数:
函数指针变量可以作为某个函数的参数来使用的,回调函数就是一个通过函数指针调用的函数。
以下是来自知乎作者常溪玲的解说:
你到一个商店买东西,刚好你要的东西没有货,于是你在店员那里留下了你的电话,过了几天店里有货了,店员就打了你的电话,然后你接到电话后就到店里去取了货。在这个例子里,你的电话号码就叫回调函数,你把电话留给店员就叫登记回调函数,店里后来有货了叫做触发了回调关联的事件,店员给你打电话叫做调用回调函数,你到店里去取货叫做响应回调事件。
五、C结构体
C 数组允许定义可存储相同类型数据项的变量,结构是 C 编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。结构体中的数据成员可以是基本数据类型(如 int、float、char 等),也可以是其他结构体类型、指针类型等。
结构体定义示例:
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
如需对结构体变量初始化,则需要在最后一行修改,book = {初始化内容(用,隔开)};
访问结构体成员则只需要book.title即可。
结构可以作为函数参数,传参方式与其他类型变量或指针类似。
此外还可以使用指向结构的指针。
C语言到此已经基本结束,但对于进阶部分的用法还有很多,我暂时没有能力一一列举,但是在后续的学习中会继续补充。
本文以及上篇内容为个人在阅读其他文章时所做笔记,仅供参考。另外大家也可以关注我的个人公众号:晚霁见月,共同交流学习。