理解 C 语言:从基础到高级的全面介绍

news2024/11/15 19:41:40

  • 前言
  • 特性
    • 指针
    • 结构体
    • 动态内存管理
    • 文件操作
  • 习题
  • 书籍推荐
    • 本书内容

前言

C语言是一种通用的编程语言,广泛应用于系统编程、嵌入式系统以及各种高性能应用程序的开发。它的设计理念和语法结构为许多现代编程语言奠定了基础。本文将深入探讨
C 语言的基本概念、关键特性、进阶技术及其实际应用,以帮助读者全面掌握这一经典编程语言。

C 语言由 Dennis Ritchie 于 1972 年在贝尔实验室开发。它是从 B 语言和 BCPL 语言派生而来的,目的是为 Unix 操作系统提供一种高效、灵活的编程工具。C 语言的特点包括:

  • 简洁性:C 语言的语法简洁且功能强大,这使得它能够提供高效的编程能力。
  • 结构化:C 语言支持结构化编程,鼓励程序员将代码组织成函数和模块。
  • 底层操作:C 语言允许直接操作内存和硬件,这使得它特别适合于系统级编程。
  • 高效性:编写的代码执行速度快,适合需要高性能的应用。

特性

指针

指针是 C 语言的强大功能之一,它允许程序员直接操作内存。指针变量存储另一个变量的内存地址。

  • 示例:
  • p 是指向 a 的指针,*p 表示 p 指向的内存地址中存储的值。
c
int a = 10;
int *p = &a;
printf("Address of a: %p\n", (void *)p);
printf("Value of a: %d\n", *p);

结构体

结构体是一种用户定义的数据类型,它可以组合不同类型的数据。结构体用于表示具有不同属性的数据对象。

  • 示例:

定义了一个 Person 结构体,它包含姓名和年龄两个字段。

c
typedef struct {
    char name[50];
    int age;
} Person;

int main() {
    Person p1 = {"Alice", 30};
    printf("Name: %s, Age: %d\n", p1.name, p1.age);
    return 0;
}

动态内存管理

C 语言提供了 malloc、calloc、realloc 和 free 函数来动态分配和释放内存。

  • 示例:
c
int *arr = (int *)malloc(5 * sizeof(int));
if (arr == NULL) {
    printf("Memory allocation failed\n");
    return 1;
}

for (int i = 0; i < 5; i++) {
    arr[i] = i * 10;
}

for (int i = 0; i < 5; i++) {
    printf("%d ", arr[i]);
}
printf("\n");

free(arr);

在这段代码中,malloc 函数分配了一个整型数组的内存,free 函数用于释放这块内存。

文件操作

C 语言提供了标准库函数来进行文件操作,包括 fopen、fread、fwrite 和 fclose。

  • 示例:
c
FILE *file = fopen("example.txt", "w");
if (file == NULL) {
    printf("Failed to open file\n");
    return 1;
}

fprintf(file, "Hello, File!\n");
fclose(file);

return 0;

fopen 函数以写模式打开文件,fprintf 函数将字符串写入文件,最后 fclose 关闭文件。

习题

👁‍🗨👁‍🗨1.

问题:

读入全班30个学生的C语言成绩,求全班平均成绩,并统计高于平均分
的学生人数。

分析:

读入全班30个学生的成绩也就是要用一个for循环来输入学生的成绩。学生成绩可以是小数,所以用 float 类型。30个学生的成绩可以用一个float类型的数组来存储,求全班的平均成绩即把所有的人的成绩加在一起,除以学生的数量即可。要想统计高于平均分的学生个数,就要用一个循环来比较一下学生的成绩,同时设一个变量(计数器),只要该成绩大于平均成绩就让计数器进行加一操作。

代码如下:

#include <stdio.h>
int main()
{
	float score[30], aver, sum = 0;
	int i;
	int count = 0;  //计数器
	for ( i = 0; i < 30; i++)
	{
		scanf("%f", &score[i]);
		sum += score[i];
	}
	aver = sum / 30;
	for (i = 0; i < 30; i++)
	{
		if (score[i] > aver)
			count++;
	}
	printf("aver=%f\n", aver);
	printf("count=%d\n", count);
	return 0;
}

👁‍🗨👁‍🗨 2.

问题:

输入10个整数,按每行4个数输出这些整数,最后输出这批整数的最大值。

分析:

首先想到的就是,利用创建一个数组来存放这10个数,要求每行输出4
个数,即当数组下标%4时==0;打印一个换行就行。要想输出最大值,即用一个for循环,创建一个新变量max,先假设 a[0]=max;
当循环进行后,如果下一个数比max大,就把这个数赋值给max,然后利用for循环一直比下去,如果下一个数没有max大,就不用操作,继续进行循环即可。直到循环结束,最大值也就知道了,就是max。

代码如下:


#include <stdio.h>

int main()
{
	int  score[10];
	int i;
	int max = 0;
	for ( i = 0; i < 10; i++)
	scanf_s("%d", &score[i]);
	for (i = 0; i < 10; i++)
	{
		if (i % 4 == 0&&i!=0)
			printf("\n");
		printf("%d ", score[i]);
	}
	max = score[0];
	for (i = 1; i < 10; i++)
		if (max < score[i])
			max = score[i];
	printf("\n");
	printf("%d",max);

	return 0;
}

👁‍🗨👁‍🗨3.

问题:

写一个判断素数的函数,在主函数输入一个整数,输出是否为素数的信息。

分析:

首先要明确什么是素数
除了1和它本身以外,不能被其他正整数整除的数叫素数。如:2,3,5,7,11,13,17……
所以就是说,你输入的这个数 i,用输入的这个数i %利用一个for循环,从2开始到输入的这个数 i-1,如果其中有一次==0的话即可判断是素数,如果到循环结束时还没有一次能够整除的,即可认定没有素数。

代码实现:

#include <stdio.h>
#include <string.h>
int is_Prime(int a)
{
	int i;
	if(a==1)
		return 1;
	if (a == 2)
		return 0;
	for (i = 2; i < a; i++)
	{
		if (a % i == 0)
			return 1;
		else
			return 0;
	}
}
int main()
{
	int a;
	scanf_s("%d", &a);
	if (is_Prime(a) == 0)
		printf("输入的该数是素数");
	if(is_Prime(a)==1)
		printf("输入的该数不是素数");
	return 0;
}

👁‍🗨👁‍🗨4
以下程序段的输出结果是( )
A: 12 B: 13 C: 16 D: 以上都不对

👁‍🗨👁‍🗨5
若有以下程序,则运行后的输出结果是( )
示例:
输入:2012 12 31 输入:1982 3 4
输出:366 输出:63

#include<stdio.h>
int main()
{
char s[] = "\\123456\123456\t";
printf("%d\n", strlen(s));
return 0;
}
#include <stdio.h>
#define N 2
#define M N + 1
#define NUM (M + 1) * M / 2
int main()
{
printf("%d\n", NUM);
return 0;
}

书籍推荐

《你好,C语言》本书的目的就是帮助读者系统地学习和掌握C语言的核心概念和高级特性。通过深入讲解C语言的语法、指针操作、内存管理和文件处理等重要知识点,本书旨在培养读者在C语言编程领域的能力和自信。通过丰富的示例和实践项目,读者将能够理解和应用C语言的各种技术,为自己的软件开发之路奠定坚实的基础。同时,本书将成为读者掌握C语言的重要参考资料和学习指南。
请添加图片描述
京东链接:https://item.jd.com/14165794.html

本书内容

本书共15章,具体介绍如下。

第1章“初识C语言”,介绍C语言的背景和基本概念,向读者展示为何选择C语言进行编程。

第2章“C语言基础知识”,深入讲解C语言的语法和基本结构。

第3章“数据类型”,详细介绍C语言中的各种数据类型,包括整型、浮点型、字符型等,以及它们的特性和使用方法。

第4章“格式化输入和输出”,解释如何使用格式化字符串来实现输入和输出操作,包括格式化输出、格式化输入。

第5章“运算符和表达式”,介绍C语言中的各种运算符和表达式,包括算术运算符、关系运算符、逻辑运算符等。

第6章“控制流”,讲解C语言中的条件语句(如if语句和switch语句)和循环结构(如while循环和for循环),以及如何使用它们来控制程序的流程。

第7章“数组”,详细介绍C语言中的数组,包括一维数组和多维数组的定义、初始化和操作方法。

第8章“函数”,介绍如何定义和调用函数,以及函数参数的传递和返回值的处理。

第9章“指针”,深入讲解C语言中的指针概念和操作,包括指针的定义、指针运算、指针与数组的关系,以及指针的应用场景。

第10章“字符串”,介绍C语言中处理字符串的方法,包括字符串的定义、输入和输出、比较和处理字符串的函数库等。

第11章“复合数据”,讲解C语言中的结构体和联合体,以及如何定义和使用复合数据类型来组织和管理数据。

第12章“作用域和预处理器”,介绍C语言中的作用域规则和预处理器的使用方法,包括宏定义、条件编译和头文件的引用等。

第13章“多文件代码和存储类别”,介绍如何将程序分割成多个源文件,以及存储类别的概念和使用方法,包括全局变量和局部变量的作用域等。

第14章“文件操作”,讲解如何在C语言中进行文件的读写操作,包括文本文件和二进制文件的处理、文件指针的操作,以及文件的打开和关闭等。

第15章“位操作、动态内存管理和主函数参数”,深入探讨C语言中的位操作、动态内存管理和主函数参数的处理,以及相关的技巧和注意事项。

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

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

相关文章

QT 中使用QXlsx 读写文件

PC 工具中需要操作xlsx格式的数据&#xff0c;前面使用的是QAxObject&#xff0c;需要一些设置&#xff0c;还要安装office的控件或者wps的控件&#xff0c;在一些电脑上面有的时候还会有异常&#xff0c;后面发现一个好像的开源库QXls&#xff0c;发现读写的速度比以前快&…

USB摄像头视频流转RTSP流

一、VLC查看USB摄像头视频流原理&#xff1a; USB摄像头的工作原理与VLC播放其他视频文件类似&#xff0c;主要区别在于视频流的来源是实时捕获的&#xff0c;而不是预先录制的文件。如果使用VLC将USB摄像头的视频流作为RTSP服务器广播&#xff0c;需要进一步配置 二、VLC查看…

QMQ 上云方案

优质博文&#xff1a;IT-BLOG0CN 一、挑战/注意事项 【1】生产者发送消息后&#xff0c;QMQ国内外服务器进行了双向同步&#xff0c;如果消费者国内外都部署了系统&#xff0c;就会导致消息重复消费的问题&#xff1a; 目前封装了共同的SDK重构消费者的代码&#xff0c;生产者…

单片机寄存器相关知识及应用(51单片机)

在前面的STM32中我并没有直接对寄存器进行操作&#xff0c;而是通过固件库直接引用进行各个外设的配置和应用&#xff0c;现在&#xff0c;我开始进行寄存器的学习&#xff08;51单片机&#xff09;。 我们先简单看一下80C51/52的微控制头文件 <REG52.h> 一、字节寄存…

Android 提高第一次开机速度(取消系统默认手机加密)

Android刷机后第一次开机&#xff0c;系统默认是要手机加密的&#xff0c;有些机器加密就几秒钟&#xff0c;有些机器加密要30多秒甚至更长&#xff0c;严重影响了开机速度。 修改路径&#xff1a; device/qcom/xxxx/fstab_AB_variant.qcom 有一些是这个文件&#xff1a; devic…

补:在Spring Boot 当中使用 Thymeleaf 视图解析器

补&#xff1a;在Spring Boot 当中使用 Thymeleaf 视图解析器 想要在 Spring Boot 当中使用 Thymeleaf 视图&#xff0c;就需要导入相关的 jar 依赖。在 pom.xml 文件中配置 。 <!-- 引入 thymeleaf-start ,项目会自动完成配置&#xff0c;--><dependency>…

MPU6050移植DMP读出三轴角度

先决条件 MPU6050移植完成&#xff0c;能够正确读出加速度和陀螺仪原始数据 DMP移植 官方包代码复制 解压demo&#xff0c;打开motion_driver_6.12\arm\STM32F4_MD6\Projects\eMD6\core\driver&#xff0c;复制路径下的eMPL到自己工程 代码移植 需要修改的有三个文件&am…

GD32/STM32启动过程

GD32/STM32启动过程 文章目录 GD32/STM32启动过程前言一、系统架构二、自举配置三、启动文件四、启动流程总结 前言 本文以STM32F407为例简单介绍其启动过程。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、系统架构 STM32F407的系统架构如图所…

libyuv之linux编译

文章目录 一、下载源码二、编译源码三、注意事项1、银河麒麟系统&#xff08;aarch64&#xff09;&#xff08;1&#xff09;解决 armv8-adotprodi8mm 指令集支持问题&#xff08;2&#xff09;解决 armv9-asve2 指令集支持问题 一、下载源码 到GitHub网站下载https://github.…

【JAVA】Undertow的使用及性能优化,以及Undertow与Tomcat的对比

文章目录 Undertow优势Undertow使用Undertow性能优化线程池配置缓冲区和内存使用连接和请求超时禁用无关的设置编程式配置启用HTTP/2 Undertow与Tomcat的对比 更多相关内容可查看 当你进行Tomcat调优发现在怎么调都无法满足需求的时候&#xff0c;Undertow容器在性能和内存上都…

盘点2024年大家都在用的短视频剪辑工具

你现在休息的时间是不是都靠短视频来消遣&#xff1f;看着看着你就会发现短视频制作好像我也可以了吧&#xff1f;这次我就介绍一些简单好操作的短视频剪辑工具。 1.FOXIT视频剪辑 连接直达>>https://www.pdf365.cn/foxitclip/ 短视频剪辑其实也不难&#xff0c;只需…

MySql-表的内外连接

文章目录 前言一、内连接二、外连接1.左外连接2.右外连接 前言 表的内外连接跟我们上节课讲的笛卡尔积很相似。 一、内连接 格式&#xff1a;select 字段 from 表1 inner join 表2 on 连接条件 and 其他条件&#xff1b; 例如&#xff1a;显示SMITH的名字和部门名称 二、外…

RB-SQL:利用检索LLM框架处理大型数据库和复杂多表查询的NL2SQL

NL2SQL的任务是将自然语言问题转换为SQL查询&#xff0c;以便从数据库中获取答案。现有LLM来指导SQL生成的方法在处理大型数据库和复杂多表查询时存在挑战&#xff0c;尤其是在处理冗余信息和提高提示工程效率方面。 (a) 利用大型语言模型&#xff08;LLM&#xff09;解决文本…

ctfshow-web入门-sql注入(web249-web253)nosql 注入

目录 1、web249 2、web250 3、web251 4、wen252 5、web253 1、web249 开始nosql,flag在flag中 $user $memcache->get($id); 使用 Memcache 类的 get 方法从缓存中获取数据&#xff0c;$id 是传入的键&#xff0c;用于从缓存中获取与该键对应的值&#xff0c;结果存储…

明基相机sd卡格式化还能恢复数据吗?可以这样操作

随着数字摄影的普及&#xff0c;相机SD卡已成为我们记录生活点滴的重要载体。然而&#xff0c;不小心将SD卡格式化&#xff0c;导致珍贵照片和视频瞬间消失&#xff0c;无疑是摄影爱好者的一大噩梦。面对这样的突发情况&#xff0c;许多朋友可能会感到无助与绝望。但实际上&…

【计算机组成原理】概述+数制与编码

目录 计算机组成原理概述计算机基本组成计算机系统的层次结构计算机性能指标 数制与编码进位计数制及其相互转换数据的编码与表示校验码 计算机组成原理概述 计算机基本组成 运算器、控制器、存储器、输入输出设备 运算器&#xff1a;完成数据的暂存、变换、算术运算和逻辑…

OpenCV结构分析与形状描述符(23)确定一个点是否位于多边形内的函数pointPolygonTest()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 进行点在轮廓内的测试。 该函数确定点是在轮廓内、轮廓外&#xff0c;还是位于一条边上&#xff08;或与顶点重合&#xff09;。它返回正值&…

【可变参模板】基类参数包的展开

一、基类参数包的展开 1.1基类参数包的展开 C C C是一个支持多继承的语言&#xff0c;因此继承的类也可以是一个基类的参数包 注意继承的语法是 p u b l i c : c l a s s . . . public: class ... public:class...&#xff0c;需要补充 . . . ... ...作为基类参数包的标志。…

Linux 驱动编写框架 并编译导入开发板

向内核新加文件&#xff1a;例如 demo1.c 1. 创建并编辑新的文件 #include <linux/init.h> #include <linux/kernel.h> #include <linux/types.h> #include <linux/fs.h> #include <linux/module.h> #include <linux/kdev_t.h> #include …

Qt控制开发板的LED

Qt控制开发板的LED 使用开发板的IO接口进行控制是嵌入式中非常重要的一点&#xff0c;就像冯诺依曼原理说的一样&#xff0c;一个计算机最起码要有输入输出吧&#xff0c;我们有了信息的接收和处理&#xff0c;那我们就要有输出。 我们在开发板上一般都是使用开发板的GPIO接口…