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

全部评论
什么时候更新呀😍😍
点赞 回复 分享
发布于 2023-04-10 00:15 广东
😀
点赞 回复 分享
发布于 02-04 22:11 山东

相关推荐

11-01 20:03
已编辑
门头沟学院 算法工程师
Amazarashi66:这种也是幸存者偏差了,拿不到这个价的才是大多数
点赞 评论 收藏
分享
努力学习的小绵羊:我反倒觉得这种挺好的,给不到我想要的就别浪费大家时间了
点赞 评论 收藏
分享
3 5 评论
分享
牛客网
牛客企业服务