Cweek1

C语言学习

一.初识C语言

1.如何写C代码

①创建工程
②添加源文件:c文件:源文件,h文件:头文件
代码实例:
请添加图片描述

main函数是程序的入口,有且仅有一个
在C语言中,#include <stdio.h> 是一个预处理指令,用于将标准输入输出库(stdio.h)包含到程序中。这个库包含了一系列用于输入和输出的函数声明,例如printf和scanf等。通过包含这个头文件,你可以在程序中使用这些函数而不需要自己重新声明它们。

第一行代码

scanf函数是C语言提供的,VS编译器中相应的函数是scanf_s,所以在VS编译器中使用scanf会被警告(很多函数都会被警告)
#define _CRT_SECURE_NO_WARNINGS就是用来去除这个警告的

2.数据类型

类型说明
int整型,4字节
short短整型,2字节
long长整型,4字节
long long更长的整型,8字节
char字符类型,1字节
float单精度浮点数,4字节
double双精度浮点数,8字节

C语言没有String类型

3.变量和常量

变量的定义方式:类型 变量名;
其中:定义在main函数或者其他函数中的变量叫局部变量,定义在代码块({})之外的变量叫全局变量
局部变量和全局变量名字相同时,局部变量优先
输入函数:scanf()
注意:C语言规定,定义变量必须在代码块的最前面

(1)变量的作用域

变量只能在它所在的代码块中使用,能使用该变量的代码块就叫作用域
全局变量的作用域是整个工程

(2)变量的生命周期

局部变量的生命周期:进入作用域生命周期开始,出作用域生命周期结束
全局变量的生命周期:整个程序的生命周期


常量的分类:
  1. 字面常量:3,4等
  2. const修饰的常变量(const给变量赋予常属性,所以叫常变量)
  3. #define定义的标识符常量,如:#define MAX 10
  4. 枚举常量
枚举

枚举关键字:enum
定义枚举常量:

enum NUM
{
  1,
  2,
  3
};

其中:123是枚举常量,他们的值是他们的索引

4.字符串、转义字符、注释

"hello \n"这种双引号引起来的一串字符叫字符串字面值
注:字符串的结束标志是一个\0,在计算字符串长度时\0,不算做字符串内容
字符串可以放到字符数组里:char arr[] = “abc”;,其中arr就等于{1, 2, 3, \0}(手动在数组里加’\0’也可以)
strlen()函数可以返回字符数组的长度,要使用strlen函数,需要先引入string库:#include <string.h>
注意:对于一个末尾没有\0的数组,strlen函数返回的是一个随机值
C语言中的转义字符:
请添加图片描述

还有\xdd,其中dd表示2个十六进制数字,如:\x30 0
其中:水平制表符是四个空格,也就是一个tab的空格


注释方法:

  1. C语言的注释风格:/**/(不能嵌套,不建议用)
  2. C++的注释风格://

5.原码、负码、补码

原码按二进制位取反得到反码
反码+1得到补码
只要是整数,在内存中存储的都是二进制的补码

6.关键字

常见的关键字:
请添加图片描述

auto:局部变量前面默认会有auto(被省略),在代码块结束后变量会被自动销毁
register:寄存器,可以加在经常要使用的变量前,将变量存储到寄存器中(注:作用是建议把变量存到寄存器中,计算机的寄存器有限,不可能把所有数据都放到寄存器中)
signed:有符号的,int定义的变量默认是有符号的,前面的signed默认被省略
unsigned:被修饰的int变量永远是正数
typedef:定义类型,如:typedef unsigned int p_int,将p_int定义为unsigned int的别名
void:与java类似
static:静态的,修饰在局部变量前时,局部变量在所有代码结束前不会被销毁        ~~~~~~       修饰在全局变量前时,全局变量只能在当前文件中使用        ~~~~~~       修饰在函数前时,函数的外部链接属性变成了内部链接属性,即无法被外部声明
extern:声明外部符号,如:extern int num;,可以引用外部文件的全局变量

7.#define定义常量和宏

定义表示符常量:#difine 常量名 数值
定义宏:#difine 函数名(参数,…) (代码块),作用:简化代码的编写

8.指针

有一种变量是用来存放地址的,这种变量叫指针变量
取一个变量的地址:int* p = &a;(int*是p的类型)
其中:&是取地址操作符
:解引用操作符,对于上面那句代码来说,*p == a
可以通过
p操作a变量
指针大小在32位平台是4个字节,在64位平台是8个字节

9.结构体

结构体关键字:struct
结构体类似于java中的对象
结构体语法:

struct Book
{
  char name[1];
  short price;
}

创建结构体变量:struct Book b1 = {‘C语言’, 10};
使用结构体变量中的元素:b1.name
获取结构体的指针:struct Book* pb = &b1;
箭头操作符:->,作用是获得指针指向的对象的元素,如:pb->name,就可以获得name
注意:name是一个数组,不能直接用b1.name进行赋值,要用strcpy(b1,name, ‘C++’),其中strcpy是string库中的,意思为string copy

二.分支和循环

1.分支语句

语句:分号之间的代码就是一个语句,空语句也是语句

(1)if

语法:

if (表达式)
{
  语句
}
else if (表达式)
{
  语句
}
else
{
  语句
}

注意:{}可写可不写
悬空else:C语言中else会与离他最近的if匹配
在C语言中,表达式中写赋值语句不会报错且默认为true,容易写错,所以我们一般将num == 5写成5 ==num

(2)switch

语法:

switch (整型表达式)
{
  case 整数:
    代码;
    break;
  case 整数:
    代码;
    break;
  [default:
    break;
  ]
}

default是可选语句,用于处理非法数据
如果不加break,代码会全部执行

2.循环语句

(1)while

语法:

while (表达式)
{
  语句;
}

可以写continue和break
{}可以省略


getchar函数可以从键盘中获取一个字符的ASCII码(stdio库中的函数)
putchar函数可以输出ASCII码对应的字符(stdio库中的函数)
代码实例:
请添加图片描述

(ch = getchar()) != EOF中的ch=必写,不然输入EOF也不会结束
注意:在C中字符类型是以ASCII码存储的,所以ch可以直接跟字母比较
注意:用完scanf后我们的输入缓冲区会残留一个\n,所以如果后面还要输入的话,在这个scanf后写一个while((ch = getchar()) != ‘\n’)清空缓冲区

(2)for

语法:

for(表达式1; 表达式2; 表达式3)
{
  代码
}

{}可写可不写
建议在区间中选择前闭后开的形式
可以在for中写两个变量来控制,代码实例:for(x = 0, y = 0; x < 2 && y < 5; x++, y++)

(3)do…while

语法:

do
{
  代码
}
while (表达式)
{
  代码
}

do后的{}如果省略,那么do后只能写一个语句

随机数生成

stdlib库的rand(void)函数可以生成一个0-32767的随机整数
srand是用于设置随机数发生器的种子。它的原型如下:

void srand(unsigned int seed);

其中 seed 是一个无符号整数,用于初始化随机数发生器的种子.通常情况下,可以使用当前时间作为种子,以确保每次运行程序时产生的随机数序列都是不同的
代码实例:srand((unsigned int)time(NULL));
其中:time函数是time库中的函数用于获取当前的时间戳

3.goto语句

C语言中提供了可以随意滥用的goto语句和标记跳转的标号
从理论上goto语句是没必要的,没有goto语句也完成程序
goto语句最常见的用法就是终止程序在某些深度嵌套的结构的处理过程,例如一次跳出多层循环
代码示例:

for()
  for()
    for()
      if()
        goto error;
error:
  if()
    代码

其中:error可以是任何字符串,只是作为一个标识,用于跳转

其它函数

system(‘命令’):stdlib库中的函数,作用是在cmd中执行括号中的命令
strcmp(‘string’, ‘string’):string compare,string库中的,作用是比较两个字符串,如果这两个字符串相同,则返回0

三.函数

1.函数的调用

函数的调用分为两种:传值调用和传址调用
当你将一个变量作为参数传递给一个函数时,函数会得到这个变量的拷贝而不是原始变量本身
传址调用时函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式
这种传参方式可以让函数和函数外边的变量建立真正的联系,也就是函数内部可以改变传入的参数的实际值
如果传过去的是一个数组,那么传过去的不是整个数组,而是第一个元素的地址,第一元素的地址+1就是第二元素的地址
printf函数返回的输出的数据的长度
可以用#include '文件名.h’来引入其它C语言文件

2.关于函数的引入

#include会把文件中的代码copy过来,但是为了避免重复copy浪费资源,可以写

#ifndef __文件名_H__
代码
#endif

3.C语言的内存

C语言内存分为三块:栈区、堆区和静态区
栈区用于存储局部变量和函数形参
堆区用于存储动态开辟的内存,如:malloc和calloc
静态区用于存储全局变量和static修饰的变量
递归写得不好就很可能出现栈溢出的问题

四.数组

1.一维数组的创建和初始化

创建数组的语法:类型 数组名[数组长度(常量)] = {数据1, 数据2,…}
char arr[5] = ‘ab’;这是不完全初始化,其中arr的后三位都是0(第三位其实是\0
访问数组的元素:数组名[索引]
sizeof函数可以计算数据所占空间的大小(单位是字节),sizeof(arr)/sizeof(arr[0])即为数组的长度
注意:strlen可以返回数组中\0之前的长度

2.一维数组的内存布局

数组在内存中是连续的:
请添加图片描述

相邻元素的地址之间的差值通常是一个定值,取决于类型和计算机架构

3.二维数组的创建

语法:类型 数组名[数组长度][数组长度] = {数据1, 数据2,…};
代码示例:int arr[2][2] = {1, 1, 1};把第一行和第二行的第一位定义为1
或者也可以这样写:int arr[2][2] = {{1, 1}, {1}};
二维数组的其中一个长度可以不写,默认为初始化的长度
注意:二维数组的元素的地址也是连续的

4.数组作为函数参数

如果对数组进行传参,实际上传递过去的是数组的首元素的地址&arr[0]
注意:实际上这并不影响使用,arr[1]依旧能获取第二位元素,只是sizeof函数会受到影响,所以计算数组长度要在函数外
实际上:数组名的值就是首元素地址(有两个例外),对数组名进行解引用也能得到首元素
例外:

  1. sizeof(数组名),此时数组名表示整个数组
  2. &数组名,此时数组名代表整个数组,取出的是整个数组的地址(实际上是首元素的地址,但是给它+1时它会变成第二位元素地址)

不用第三个变量交换两个变量

写法1:

a = a + b;
b = a - b;
a = a - b;

问题:整形溢出
写法2:

a = a^b;
b = a^b;
a = a^b;

问题:可读性差,执行效率低

五.操作符

1.运算操作符

运算操作符:±*/%
int a = 5 / 2;输出2
int a = 5 % 2;输出1.000000(默认六位小数)
注意:%操作符不能作用于浮点数

2.移位操作符

移位操作符:左移<< 右移>>
>>的作用:

  1. 算术右移:右边丢弃,左边补原符号位(多数编译器的右移)
  2. 逻辑右移:右边丢弃,左边补0
int a = -1;
a >> 1;

上述代码返回-1
原因:整数按补码在内存中存储,-1->111111111…(省略),所以右移之后还是-1
注意:不能移动负数位

3.位操作符

位操作符:&|^
注:操作数必须是整数
作用:按二进制位与、或、异或

4.赋值操作符

赋值操作符:=
复合赋值操作符:+= -= *= /= %= >>= <<= &= |= ^=

5.单目操作符

单目操作符:
请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows 11 下 kafka 的安装踩坑

安装 windows系统kafka小白入门篇——下载安装&#xff0c;环境配置&#xff0c;入门代码书写&#xff08;推荐&#xff09; kafka在windows下安装和使用入门教程 问题1 参考链接 运行kafka集成的zookeeper时&#xff0c;命令&#xff1a;bin\windows\zookeeper-server-star…

JavaEE初阶-多线程5

文章目录 一、线程池1.1 线程池相关概念1.2 线程池标准类1.3 线程池工厂类1.4 实现自己的线程池 二、定时器2.1 java标准库中的定时器使用2.2 实现一个自己的定时器2.2.1 定义任务类2.2.2 定义定时器 一、线程池 1.1 线程池相关概念 池这个概念在计算机中比较常见&#xff0c…

PXE+Kickstart无人值守安装安装Centos7.9

文章目录 一、什么是PXE1、简介2、工作模式3、工作流程 二、什么是Kickstart1、简介2、触发方式 三、无人值守安装系统工作流程四、实验部署1、环境准备2、服务端&#xff1a;关闭防火墙和selinux3、添加一张仅主机的网卡4、配置仅主机的网卡4.1、修改网络连接名4.2、配IP地址4…

​​​【收录 Hello 算法】5.3 双向队列

目录 5.3 双向队列 5.3.1 双向队列常用操作 5.3.2 双向队列实现 1. 基于双向链表的实现 2. 基于数组的实现 5.3.3 双向队列应用 5.3 双向队列 在队列中&#xff0c;我们仅能删除头部元素或在尾部添加元素。如图 5-7 所示&#xff0c;双向队列&#xff08…

校园志愿者管理系统带万字文档

文章目录 校园志愿者管理系统一、项目演示二、项目介绍三、10000字论文参考四、部分功能页面五、部分代码展示六、底部获取项目源码和万字论文参考&#xff08;9.9&#xffe5;带走&#xff09; 校园志愿者管理系统 一、项目演示 校园志愿者管理系统 二、项目介绍 基于Spring…

【数据结构】-- 相交链表-环形链表

交叉链表 . - 力扣&#xff08;LeetCode&#xff09; 如果链表的两条链的长度一样&#xff0c;链表两端对齐&#xff0c;解决这个问题将会变得非常简单&#xff0c;直接分别遍历两个链表&#xff0c;想等时的节点即为所求。我们想办法让链表对齐--分别从a和b遍历链表&#xff…

centos7中如何全局搜索一下nginx的配置文件?

在CentOS 7中搜索Nginx的配置文件&#xff0c;你可以使用一些常用的命令行工具&#xff0c;比如find、grep等。这些工具可以帮助你在文件系统中查找文件&#xff0c;也可以用来查找Docker容器内部的文件&#xff0c;只要你知道如何访问容器的文件系统。 1. 搜索系统中的Nginx配…

nowcoder——回文结构

链表的回文结构_牛客题霸_牛客网 (nowcoder.com) 我们来分析该题&#xff1a;我们首先要清楚什么是回文结构&#xff1f;其实就是对称结构。如果一个链表呈对称结构就说明该链表具有回文结构。 下面给上一些例子&#xff1a; 那我们怎么判断该链表是否属于回文结构呢&#xf…

Web3 Tools - Base58

Base58编码 Base58编码是一种用于表示数字的非常见的编码方法。它通常用于加密货币领域&#xff0c;例如比特币和其他加密货币的地址表示。 什么是Base58编码&#xff1f; Base58编码是一种将数字转换为人类可读形式的编码方法。与常见的Base64编码不同&#xff0c;Base58编码…

AI智能体|我把Kimi接入了个人微信

大家好&#xff0c;我是无界生长。 最近加入AI学习交流群的小伙伴越来越多&#xff0c;我打算在微信群接入一个聊天机器人&#xff0c;让它协助管理微信群&#xff0c;同时也帮忙给群友解答一些问题。普通的群聊机器人肯定是不能满足需求的&#xff0c;得上AI大模型&#xff0c…

使用 Python 中的 TensorFlow 检测垃圾短信

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

绘唐3启动器怎么启动一键追爆款3正式版

绘唐3启动器怎么启动一键追爆款3正式版 工具入口 一.文案助手&#xff1a; 【注意&#xff01;&#xff01;】如果图片无显示&#xff0c;一般情况下被杀毒拦截&#xff0c;需关闭杀毒软件或者信任文件路径。 win10设置排除文件&#xff1a; 1.【新建工程】使用前先新建工程…

【Flutter】极光推送配置流程(VIVO/OPPO/荣耀厂商通道) 章三

前言 很高兴大家来看小编写的文章&#xff5e;&#xff5e; 继【Flutter】极光推送配置流程(极光通道/华为厂商/IOS) 章一 继【Flutter】极光推送配置流程(小米厂商通道) 章二 接下配置VIVO/OPPO/华为荣耀的厂商通道 所有截图来源于公司项目&#xff0c;所以会有大量马赛克&am…

5.13作业

使用消息队列实现的2个终端之间的互相聊天 并使用信号控制消息队列的读取方式&#xff1a; 当键盘按ctrlc的时候&#xff0c;切换消息读取方式&#xff0c;一般情况为读取指定编号的消息&#xff0c; 按ctrlc之后&#xff0c;指定的编号不读取&#xff0c;读取其他所有编号的…

Pikachu 靶场 URL 重定向通关解析

前言 Pikachu靶场是一种常见的网络安全训练平台&#xff0c;用于模拟真实世界中的网络攻击和防御场景。它提供了一系列的实验室环境&#xff0c;供安全专业人士、学生和爱好者练习和测试他们的技能。 Pikachu靶场的目的是帮助用户了解和掌握网络攻击的原理和技术&#xff0c;…

Qt与QWebEngineView 交互-调试窗口-JS拓扑图完整示例参考

1&#xff1a;介绍&#xff1a; Qt与QWebEngineView的交互 简介之前文章解释过&#xff0c;链接在下面 传送门&#xff1a;Qt与QWebEngineView 交互完整示例参考_qt qwebview-CSDN博客 一般在使用这种方式时&#xff0c;可能会出现各种问题而不好调试&#xff0c;如果能够像…

【408精华知识】提高外部排序速度的三种方式

文章目录 一、败者树二、置换-选择排序三、最佳归并树 一、败者树 还没写完… 二、置换-选择排序 三、最佳归并树 写在后面 这个专栏主要是我在学习408真题的过程中总结的一些笔记&#xff0c;因为我学的也很一般&#xff0c;如果有错误和不足之处&#xff0c;还望大家在评…

基于Echarts的大数据可视化模板:服务器运营监控

目录 引言背景介绍研究现状与相关工作服务器运营监控技术综述服务器运营监控概述监控指标与数据采集可视化界面设计与实现数据存储与查询优化Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所选设计方案模板如何满足管理的特定需求模板功能与特性…

I. Integer Reaction

Problem - I - Codeforces 看到最小值最大值&#xff0c;二分答案。 思路&#xff1a;每次二分时开两个集合&#xff0c;分别表示 0 0 0颜色和 1 1 1颜色。如果是 c c c颜色&#xff0c;先将值存入 c c c颜色&#xff0c;之后在 ! c !c !c颜色中找大于等于 m i d − a mid - a…

.NET开源、功能强大、跨平台的图表库LiveChart2

LiveCharts2 是 从LiveCharts演变而来,它修复了其前身的主要设计问题,它专注于在任何地方运行,提高了灵活性,并继承LiveCharts原有功能。 极其灵活的数据展示图库 (效果图) 开始使用 Live charts 是 .Net 的跨平台图表库,请访问 https://livecharts.dev 并查看目标平…