C语言基础学习

1 extern

在C语言中,关键字extern用于声明一个变量或函数是在其他文件或模块中定义的。它告诉编译器变量或函数是在其他地方被定义的,而不是在当前文件中。这样做可以使多个文件共享同一个变量或函数,而不需要在每个文件中都重新定义一次。

示例:

extern int counter; // 声明一个外部变量counter,该变量在其他文件中定义
extern void display(); // 声明一个外部函数display,该函数在其他文件中定义`在这里插入代码片`

在使用extern声明变量或函数时,对于函数来说,只需要声明其返回类型和参数类型,而不需要提供函数体。对于变量来说,只需要声明变量的类型,而不需要提供变量的值。这是因为extern关键字只是用来告诉编译器该变量或函数是在其他地方定义的,不需要在当前文件中提供其具体实现。

总之,extern关键字的作用是告诉编译器某个变量或函数是在其他地方定义的,编译器不需要对其进行分配存储空间或生成其代码,而是在链接阶段找到该变量或函数的定义。

2 volatile

在C语言中,关键字volatile用于声明一个变量是易变的,即该变量的值可以在程序的执行过程中被意外地改变,而不仅仅是由程序中的语句所导致。

通常情况下,编译器为了优化程序的性能,会对变量的访问和操作进行优化,可能会将变量的值缓存到寄存器中,这样可能会导致程序对该变量的读取与实际存储的值不一致。而使用volatile关键字声明的变量告诉编译器不要对该变量进行优化,每次访问该变量时都直接读取其值。

示例:

volatile int sensorValue; // 声明一个易变的变量sensorValue

当程序需要与硬件设备进行交互或者需要处理一些可能被异步事件改变的状态时,通常会使用volatile关键字来声明相关的变量,以确保程序可以正确地读取和操作这些变量的值。

3 struct

结构体是C语言中用来组织和存储一组相关数据的一种数据类型。它允许将不同类型的数据组合在一起,从而形成一个新的数据类型。下面是一个简单的示例来说明结构体的应用:

假设我们要定义一个学生的数据类型,包括学生的姓名、年龄和成绩,我们可以使用结构体来表示这种数据类型。

#include <stdio.h>

// 定义一个结构体表示学生
struct Student {
char name[50];
int age;
float score;
};

int main() {
// 声明一个名为student1的结构体变量
struct Student student1;

// 对结构体变量进行赋值
strcpy(student1.name, "Jenny");
student1.age = 20;
student1.score = 85.5;// 打印结构体变量的值
printf("Student Name: %s\n", student1.name);
printf("Student Age: %d\n", student1.age);
printf("Student Score: %.1f\n", student1.score);return 0;

}
在这个示例中,我们首先使用struct Student定义了一个名为Student的结构体,其中包括了学生的姓名、年龄和成绩。然后在main函数中,我们声明了一个名为student1的结构体变量,并对其进行了赋值。最后,我们打印了这个结构体变量的值。

通过结构体,我们可以把学生的姓名、年龄和成绩组织在一起,形成一个新的数据类型Student,方便地对学生的相关信息进行管理和操作。

这个示例说明结构体的应用,它使得我们可以更加灵活地组织和管理数据,提高了代码的可读性和可维护性。

4 typedef

在C语言中,typedef关键字用于为现有的数据类型创建新的类型名称。通过typedef,可以为数据类型提供新的别名,使得代码更易读、更模块化,并提高了代码的可维护性。

下面是一个示例,展示了如何使用typedef来创建新的数据类型别名:

#include <stdio.h>// 使用typedef为int创建一个名为newInt的别名
typedef int newInt;int main() {newInt number = 5; // 使用newInt别名声明一个整数变量printf("%d\n", number);return 0;
}

在这个示例中,我们使用typedef为int创建了一个新的别名newInt。然后在main函数中,我们使用这个新的别名来声明一个整数变量number。在这个示例中,newInt和int都是可以互换使用的类型名。

typedef也经常与结构体一起使用,以便更容易地定义结构体类型:

#include <stdio.h>// 使用typedef为struct Student创建一个名为Student的别名
typedef struct {char name[50];int age;float score;
} Student;int main() {Student student1; // 使用Student别名声明一个结构体变量strcpy(student1.name, "Jenny");student1.age = 20;student1.score = 85.5;printf("Student Name: %s\n", student1.name);printf("Student Age: %d\n", student1.age);printf("Student Score: %.1f\n", student1.score);return 0;
}

在这个示例中,我们使用typedef来为结构体类型创建了一个名为Student的别名,从而使得更加简洁地声明结构体变量。

通过使用typedef,我们可以简化代码,提高代码的可读性,并且减少了对数据类型的复杂依赖。

5 ->

在C语言中,"->"是一个操作符,通常用于访问结构体指针所指向的成员。它可以简化通过结构体指针访问结构体成员的操作。

示例:

#include <stdio.h>
#include <stdlib.h>

// 定义一个结构体表示学生
struct Student {
char name[50];
int age;
float score;
};

int main() {
// 使用动态内存分配创建一个学生结构体指针
struct Student studentPtr = (struct Student)malloc(sizeof(struct Student));

// 通过结构体指针使用"->"操作符访问结构体成员并赋值
strcpy(studentPtr->name, "Jenny");
studentPtr->age = 20;
studentPtr->score = 85.5;// 通过结构体指针使用"->"操作符访问结构体成员并打印
printf("Student Name: %s\n", studentPtr->name);
printf("Student Age: %d\n", studentPtr->age);
printf("Student Score: %.1f\n", studentPtr->score);// 释放动态分配的内存
free(studentPtr);return 0;

}
在这个示例中,我们使用"->"操作符来访问通过动态内存分配得到的学生结构体指针所指向的成员,并进行赋值和打印。这使得访问结构体指针所指向的成员变得更为简洁和方便。

总之,"->"操作符通常用于访问结构体指针所指向的成员,它能够简化通过结构体指针访问结构体成员的操作。

6 sprintf

sprintf 是一个C标准库中的函数,用于将格式化的数据写入一个字符串数组中。其原型定义如下:

int sprintf ( char * str, const char * format, … );
该函数将根据格式字符串format中的格式说明符将其他参数(如果有的话)进行格式化,并将结果写入字符串数组str中。sprintf函数的使用方式与printf函数类似,但不同之处在于printf函数将格式化后的输出发送到标准输出流(通常是显示器),而sprintf函数将格式化后的输出写入字符串数组中。

下面是一个示例,演示了sprintf函数的使用:

#include <stdio.h>

int main() {
char str[100];
int num = 10;
float f = 3.14;

sprintf(str, "The value of num is %d and the value of f is %.2f", num, f);printf("%s\n", str);return 0;

}
在这个示例中,sprintf将格式化后的字符串写入了数组str中,然后通过printf打印出来。由于sprintf将格式化后的内容写入了str中,因此str数组中存储了格式化后的字符串。

需要注意的是,使用sprintf时需要确保目标字符串数组有足够的空间来存储格式化后的内容,防止造成缓冲区溢出的问题。

总之,sprintf函数用于将格式化后的数据写入一个字符串数组中,可以用于构建动态生成的字符串。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751185.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣59. 螺旋矩阵 II

思路&#xff1a;此题思路就是绕圈遍历&#xff0c;全靠条件处理技巧&#xff0c;重点要清楚的就是循环不变量&#xff1a;左闭右开&#xff08;即拐弯处的一个数&#xff0c;留给第二行处理&#xff09; 以下是代码随想录的作者的一张图片&#xff0c;每次for循环&#xff0c;…

使用三种方式读取文本文件

文章目录 &#x1f354;需求&#x1f384;思路⭐代码⭐效果&#x1f6f8;注意 在 Java 中&#xff0c;读取文件通常涉及以下几个步骤&#xff1a; 打开文件&#xff1a;首先需要创建一个文件对象&#xff0c;表示要读取的文件。这个文件对象可以包含文件路径、文件名等信息。 …

使用canvas实现图纸标记及回显

图纸 图纸标记后的效果图 最近做的一个qms项目里面&#xff0c;需要前端在图纸上实现标记及标记后的内容还要能够回显&#xff0c;然后后端通过标记的点&#xff0c;去读取标记图纸的内容&#xff0c;如一些公式、数据之类的&#xff0c;目前实现的功能有 在图纸上面进行矩形…

Mysql 索引、锁与MVCC等相关知识点

文章目录 Mysql锁的类型锁使用MVCC快照读和当前读读视图【Read View】串行化的解决 索引类型存储方式区分逻辑区分实际使用区分索引失效情况 索引建立规范SQL编写规范exlpain字段解析ACID的原理日志引擎慢SQL整合SpringBoot博客记录 Mysql锁的类型 MySQL中有哪些锁&#xff1a…

Flutter:构建美观应用的跨平台方案

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

C#理解进程、线程和任务

一、进程、线程和任务 C# 中的进程、线程和任务时&#xff0c;通常涉及到多任务处理、并行编程和异步操作。下面我将详细解释这三个概念&#xff1a; 1.进程 定义&#xff1a;进程是正在运行的程序的实例。每个进程都有自己的内存空间、系统资源和执行状态。C#中的表示&…

【软考】SMTP与SNMP

目录 1. SMTP2. SNMP 1. SMTP 1.简单邮件传输协议&#xff08;Simple Mail Transfer Protocol&#xff09;2.SMTP主要负责底层的邮件系统如何将邮件从一台机器发送至另外一台机器3.该协议工作在TCP协议的25号端口4.小记&#xff1a;Transfer与Transmission都有T 2. SNMP 1.简…

C#创建第一个PIESDK模版的项目

目录 环境配置创建项目方式 环境配置 1软件安装 通过安装光盘或者U盘等介质读取PIE软件的安装程序和使用文档。程序安装过程比较简单&#xff0c;软件本身不借助与任何第三方程序&#xff0c;直接双击安装程序【PIESDK.Net_V6.3_Windows_X64.exe】安装文件&#xff0c;即可安装…

尚硅谷vue全家桶(上)

vue2 简介第一天第二天 第三天第四天第五天 第六天第七天第八天 第九天 网课链接&#xff08;半个月拿下&#xff09; 简介 需要提前会的东西 中文文档链接点下面 vue.js 要会查文档用API 第一天 清除提示1 再文档中下载开发版本浏览器安装vue devtools插件 打开允许访问URL…

cookies为什么会有csrf风险,为什么token可以避免

CSRF 利用的是网站对用户网页浏览器的信任。 伪造请求(一般是一个非法链接): 链接伪造了目的性请求参数&#xff0c;因为地址需要同源&#xff0c;所以不会改。 Cookie 是通过浏览器将服务器返回的数据保存在本地的一小块数据&#xff08;一般小于4kb&#xff09;。当浏览器发…

各位朋友我回答一个问题大家帮忙看看是否对错!

转载&#xff1a;《发布一个简单的C语言的问题&#xff0c;有大牛可以前往指导一下》 简单的C字符串问题:编写如下面要求一个函数&#xff0c;那个最好呢&#xff1f;求各位出出点子看看如何优化。_编程语言-CSDN问答 当我认为问题最优时候我将进行开帖总结与致谢&#xff0c…

SpringBoot 中使用自定义参数解析器修改请求对象

SpringBoot 中使用自定义参数解析器修改请求对象 在 SpringBoot 应用中&#xff0c;有时我们需要在控制器方法执行之前对请求对象进行修改。自定义参数解析器提供了一种灵活的方式来实现这一需求。 1. 创建自定义参数解析器 首先&#xff0c;我们需要创建一个自定义参数解析…

[NCNN学习笔记]-1

1、前言 本次继续学习NCNN&#xff0c;希望能够坚持&#xff0c;往期学习NCNN的链接如下。 [NCNN学习笔记]-0 2、学习内容 2.1、batchnorm_arm.cpp 这个章节学习NCNN中batchnorm在NEON上的实现。batchnorm的学习可参考链接:https://zhuanlan.zhihu.com/p/93643523 在NCNN…

【C语言】字符函数与字符串函数以及内存函数 { 超详细攻略,一篇学会 }

今日分享&#xff1a;字符、字符串函数和内存函数 内存函数就是对内存进行操作的函数 字符串函数就是对字符串进行操作的函数 字符函数就是对字符进行操作的函数 str前缀的函数是字符串函数&#xff0c;头文件string.h mem前缀的函数是内存函数&#xff0c;头文件stdlib.h 字符…

C#开发五子棋游戏:从新手到高手的编程之旅

C#开发五子棋游戏&#xff1a;从新手到高手的编程之旅 目录 一、引言 二、项目规划与设计思路 三、棋盘与棋子的数据模型构建 四、交互式用户界面设计 五、核心游戏逻辑实现 一、引言 五子棋&#xff0c;作为一种古老的策略型棋类游戏&#xff0c;在全球拥有广泛的爱好者…

25考研数据结构复习·3.3.2栈和队列的应用——表达式求值

三种算术表达式 中缀表达式 ((15/(7-(11)))*3)-(2(11)) 由三个部分组成&#xff1a;操作数、运算符、界限符 运算符在两个操作数中间&#xff1a;ab&#xff1b;ab-c&#xff1b;ab-c*d ❗后缀表达式 逆波兰表达式 运算符在两个操作数后面&#xff1a;ab&#xff1b;abc-或ab…

python知识点总结(二)

这里写目录标题 1、什么是解释性语言&#xff0c;什么是编译性语言&#xff1f;2、说说中作用域是怎么划分的3、type和isinstance方法的区别4、浅拷贝和深拷贝5、python中变量在内存中存储方式6、python中的封装、继承、多态7、python中内存管理机制是怎么样的&#xff1f;8、简…

旋转中心 机械手抓料方式

一、为什么要计算旋转中心&#xff1f; 机器视觉——旋转中心的标定_旋转标定-CSDN博客 在机械手抓料的时候传送带上过来的料可能是各个角度的&#xff0c;不同的位置&#xff0c;这样如果我们没有做好机械手标定的话很难抓取&#xff0c;因此我们要做旋转中和和机械手TCP标定…

章节2:单词本该这样记

为什么我们记不住单词&#xff1f; 单词不是被胡编乱造出来的&#xff0c;单词是有规律的&#xff0c;单词是符合人类的逻辑的。 单词实际意思结构意义历史文化 我们要怎么记单词&#xff1f; 掌握单词的结构规律了解与单词有关的历史文化灵活巧计&#xff0c;不要太拘泥于…

唯一约束

Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 唯一约束 唯一约束的特点是在某一个列上的内容不允许出现重复。 例如&#xff0c;现在要收集用户的信息&#xff0c;假设包含编号&#xff08;mid&#xff09;、姓名&…