2-4小时突击C语言(4)
函数指针与回调函数
函数指针是指向函数的指针变量。
例子:
#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; }
声明了函数指针变量 p,指向函数 max。
输出结果:
请输入三个数字:1 2 3
最大的数字是: 3
回调函数
函数指针作为某个函数的参数
例子:
#include <stdlib.h> #include <stdio.h> void populate_array(int *array, size_t arraySize, int (*getNextValue)(void)) { for (size_t i=0; i<arraySize; i++) array[i] = getNextValue(); } // 获取随机值 int getNextRandomValue(void) { return rand(); } int main(void) { int myarray[10]; /* getNextRandomValue 不能加括号,否则无法编译,因为加上括号之后相当于传入此参数时传入了 int , 而不是函数指针*/ populate_array(myarray, 10, getNextRandomValue); for(int i = 0; i < 10; i++) { printf("%d ", myarray[i]); } printf("\n"); return 0; }
populate_array() 函数定义了三个参数,其中第三个参数是函数的指针。
回调函数 getNextRandomValue(),它返回一个随机值,它作为一个函数指针传递给 populate_array() 函数。
输出结果:
(随机10个数字)
C字符串
在 C 语言中,字符串实际上是使用空字符 \0 结尾的一维字符数组。
声明和初始化一个xXjXx字符串。由于在数组的末尾存储了空字符 \0,所以字符数组的大小比单词xXjXx的字符数多一个。
char site[6] = {'x', 'X', 'J', 'X', 'x', '\0'};
也可以把上面语句写为:
char site[] = {'x', 'X', 'J', 'X', 'x', '\0'};
字符串的内存表示:
索引 |
0 |
1 |
2 |
3 |
4 |
5 |
变量 |
x |
X |
J |
X |
x |
\0 |
地址 |
0x2004 |
0x2005 |
0x2006 |
0x2007 |
0x2008 |
0x2009 |
字符串操作函数:
strcpy(s1, s2); 复制字符串 s2 到字符串 s1。
strcat(s1, s2); 连接字符串 s2 到字符串 s1 的末尾。
strlen(s1); 返回字符串 s1 的长度。
strcmp(s1, s2); 如果 s1 和 s2 是相同的,则返回 0;如果 s1<s2 则返回小于 0;如果 s1>s2 则返回大于 0。
strchr(s1, ch); 返回一个指针,指向字符串 s1 中字符 ch 的第一次出现的位置。
strstr(s1, s2); 返回一个指针,指向字符串 s1 中字符串 s2 的第一次出现的位置。
例子:
#include <stdio.h> #include <string.h> int main () { char str1[14] = "runoob"; char str2[14] = "google"; char str3[14]; int len ; /* 复制 str1 到 str3 */ strcpy(str3, str1); printf("strcpy( str3, str1) : %s\n", str3 ); /* 连接 str1 和 str2 */ strcat( str1, str2); printf("strcat( str1, str2): %s\n", str1 ); /* 连接后,str1 的总长度 */ len = strlen(str1); printf("strlen(str1) : %d\n", len ); return 0; }
C结构体
结构体定义由关键字 struct 和结构体名组成,结构体名可以根据需要自行定义。
语句格式:
struct tag {
member-lis
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏主要是介绍嵌入式软件开发岗位的相关知识和学习攻略,为大家提供一份笔试与面试手册。包括有嵌入式软件开发岗位介绍与学习攻略;校园招聘和offer疑惑问题的介绍;在笔试方面,如何刷题为笔试作准备,提供往年笔试真题;在面试方面,提供相关知识的复习重点,提供面试真题。包括有:华为、蔚来、文远、大疆、三一、深信服、亚马逊、Intel、百度、科大讯飞、OPPO、京东、中兴、比特大陆|算能、美团等等