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、京东、中兴、比特大陆|算能、美团等等

查看8道真题和解析