C高级(学习)2024.8.2

server/2024/9/23 19:23:51/

目录

1.指针函数

概念

格式

2.函数指针

概念

格式

基本用法

3.函数指针数组

概念

格式  

4.共用体

格式

定义共用体变量

特性

5.枚举

定义

格式

6.存储类型

(1)auto

(2)static

(3)extern

(4)register

7.条件编译

(1)根据宏是否定义

(2)根据宏值

(3)防止头文件重复包含(放在头文件中)

1.指针函数

概念

        本质是函数,返回值是指针

格式

数据数据 *  函数名(形参)
{
        函数体
        return  地址;//失败则返回NULL
}

2.函数指针

概念

        本质是指针,指向的是函数

格式

数据类型 (*指针名)(参数列表);
数据类型: 与指向函数的返回值类型保持一致
参数列表:与指向函数的参数列表保持一致

基本用法

1.用作函数指针

int add(int a, int b)
{
        return a + b;
}

int main()
{
        int (*p)(int, int);
        p = add;
        printf("%d\n", p(2, 3));

}

2.函数指针作为另一个函数的参数,实现接口重用-->多态

int add(int a, int b)
{
        return a + b;
}

int test(int (*p)(int ,int))
{
        printf("test:%d\n",p(3,4));
        return 0;
}

int main()
{
        test(add);   

        return 0;

}

3.函数指针数组

概念

        本质是数组,数组中存放的是函数指针

格式  

数据类型 (*数组名[元素个数])(参数列表);
数据类型:和指向函数的返回值类型一致
参数列表:和指向的函数的参数列表一致
例如:int (*arr[2])(int,int)={函数名,函数名}

4.共用体

        所有成员变量共用一块地址空间

格式

union   共用体名
{
        成员列表;
};

定义共用体变量

union  共用体名字  变量名;
union  value
{
        int a;
        char b;
};
union value val;
        val.a=10;
        val.b='a';

特性

1)所有成员共用同一块地址空间
2)以最后一次赋值为内存中的实际数据
3)共用体的大小为成员中类型最大的数据的大小

共用体测大小端

union value val;
val.a = 0x12345678;
if(val.b == 0x78)
        printf("小端\n");
else if(val.b == 0x12)
        printf("大端\n");

5.枚举

定义

        一种构造数据类型,用于声明一组常数

格式

enum   枚举类型名
{
        常数1,
        常数2,
};

注意:没有赋初值时默认从0开始,向后依次递增

6.存储类型

(1)auto

        自动型,修饰局部变量,存放在栈区(一般省略)

(2)static

        静态型,可以修饰局部变量和全局变量,也可以修饰函数

注意:        

1.存放在静态区/全局区,.bss(未初始化的全局变量和静态变量)   .data(初始化的全局变量和静态变量)

2.初始值默认为0,只初始化一次

3.限制作用域 ,修饰全局变量被限制仅能在本文件中使用,修饰局部变量,作用域被限制在本函数中,但会延长其生命周期

4.修饰函数,被限制仅能在本文件中使用

(3)extern

        外部引用:可以引用其他文件中的全局变量和函数,在本文件中使用

例如:有file1.c和file2.c两个文件

file1.c

#include<stdio.h>
int n=5;
void fun()
{
        printf("hello\n");
}

file2.c
#include<stdio.h>
extern int n; //外部引用file1.c中的全局变量n
extern void fun();//外部引用file1.c中的函数fun
int main()
{
        fun();
        printf("n=%d\n",n);
        return 0;
}

(4)register

        寄存器类型,由于寄存器数量较少,申请不到空间时和auto一样

7.条件编译

(1)根据宏是否定义

#define  宏名

#ifdef  宏名
        /*code1*/ 
#else
        /*code2*/ 
#endif

        执行顺序:判断宏是否定义,如果定义了就编译code1,否则编译code2

(2)根据宏值

#define  宏名  值

#if  宏名
        /*code1*/
#else
        /*code2*/
#endif    

        执行顺序:判断宏的值是否为0,如果不为0编译code1,否则编译code2

(3)防止头文件重复包含(放在头文件中)

#ifndef    宏名
#define   宏名
        /*code*/
#endif


http://www.ppmy.cn/server/94096.html

相关文章

使用Python做一个微信机器人

项目功能介绍 现在我们用小程序做一个模拟的应用&#xff0c;智能聊天机器人。发送文字它可以回复一段话&#xff0c;或一张图片&#xff0c;是不是有点小酷&#xff01; 下面是小程序开发的一个智能聊天机器人的应用界面&#xff1a; 当然&#xff0c;这种智能回复的算法和…

linux下交叉编译licensecc

本文章只做个人笔记用 下载地址&#xff1a; #https://github.com/open-license-manager/licensecc.git #下面地址下不下来就是用第一个去官网下载git clone --recursive https://github.com/open-license-manager/licensecc.git 编译前准备3个库&#xff1a;openssl&#x…

QT多媒体编程(一)——音频编程知识详解及MP3音频播放器Demo

目录 引言 一、QtMultimedia模块简介 主要类和功能 二、QtMultimedia相关类及函数解析 QAudioInput QAudioOutput QAudioFormat QMediaPlayer QMediaPlaylist QCamera 三、音频项目实战Demo UI界面 核心代码 运行结果 四、结论 引言 在数字时代&#xff0c;音频…

普元Devops学习笔记-devops对接jenkins提示crumb不可用问题

前言 普元devops需要对接jenkins&#xff0c;对接jenkins后&#xff0c;devops会调用jenkins的提供的API。 问题 新版本的jenkins提供跨域保护&#xff0c;即大名鼎鼎的CSRF问题。 因此&#xff0c;普元devops调用jenkins的时候&#xff0c;会出现跨域问题。 后台报错信息如…

学会这个Python库,接口测试so easy

前言 我们在做接口测试时&#xff0c;大多数返回的都是json属性&#xff0c;我们需要通过接口返回的json提取出来对应的值&#xff0c;然后进行做断言或者提取想要的值供下一个接口进行使用。 但是如果返回的json数据嵌套了很多层&#xff0c;通过查找需要的词&#xff0c;就…

精选3款国内wordpress 主题,建站首选

WordPress作为一款功能强大且易于使用的建站平台&#xff0c;已经成为了许多企业和个人搭建网站的首选。为了帮助大家更好地选择适合自己的WordPress主题&#xff0c;小编将为大家推荐三款国内优秀的WordPress主题&#xff1a;子比主题、OneNav主题和RiTheme主题。 1.子比主题…

VUE框架面试整理-组件

在Vue.js中,组件是构建应用的基本单元。组件可以复用、嵌套和管理自己的状态,使得开发大型应用变得更加简单和结构化。以下是关于Vue组件的一些核心概念和用法: 创建和注册组件 全局注册 全局注册的组件可以在任何地方使用。 Vue.component(

最新小猫咪PHP加密系统源码V1.4_本地API接口_带后台

简介&#xff1a; 最新小猫咪PHP加密系统源码V1.4_完全本地化加密API接口_带后台 小猫咪PHP加密系统历时半年&#xff0c;它再一次迎来更新&#xff0c;更新加密算法&#xff08;这应该是最后一次更新加密算法了&#xff0c;以后主要更新都在框架功能上面了&#xff09;&…