Cweek2+3

C语言学习

五.操作符

5.单目操作符(2)

sizeof不能用于计算动态分配的内存
在对数组使用sizeof时,返回的是整个数组的大小(所有元素的总字节数)。而对指针使用sizeof时,返回的是指针本身的大小(通常是机器字长的大小)

6.关系操作符

> >= < <= != ==

7.逻辑操作符

&&逻辑与 ||逻辑或
i = a++ && ++b && ++c,其中如果a为0,则后面的代码都不会执行
i = a++ || ++b || ++c,其中如果a为1,则后面的代码都不会执行

8.三目操作符

a > b ? a : b, 若a>b则取a,若不大于,则取b

9.逗号表达式

逗号表达式,就是用逗号隔开的多个表达式,逗号表达式,从左向右依次执行,整个表达式的结果是最后一个表达式的结果

10.下标引用、函数调用、结构成员

下标引用:arr[x]
函数调用:getMax(a, b)
结构成员:obj.name或者obj->name

11.表达式求值

表达式求值的顺序一部分是由操作符的优先级和结合性决定
同样,有些表达式的操作数在求值的过程中可能需要转换为其它类型


隐式类型转换:c的整型算数运算总是至少以缺省整型类型的精度来进行的
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这叫整型提升
整型提升的意义:避免数据丢失或溢出,同时可以保证运算结果的准确性
char类型赋值为整型时,会默认是ASCII码并转换
代码实例:
请添加图片描述

第二种隐式类型转换:算术转换,如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行

12.操作符的属性

复杂表达式的求值有三个影响的因素:

  1. 操作符的优先级
  2. 操作符的结合性
  3. 是否控制求值顺序

i = i-- - --i是一个有问题的表达式,不同的编译器会计算出不同的结果

六.初始指针

1.指针

指针是编程语言中的对象,利用地址,它的值指向存储在电脑中的某处内存中的值
获取指针:int* p = &a;
指针就是变量,用来存放地址的变量
一个小的内存单元是一个字节

2,指针类型

指针类型决定了指针进行解引用操作的时候,能够访问空间的大小
int* p; *p能访问4个字节
char* p; *p能访问1个字节
double* p; *p能访问8个字节


指针类型还决定了指针的步长
int* p; p+1向后走4个字节
char* p; p+1向后走1个字节
double* p; p+1向后走8个字节

3.指针与数组

指针可以直接修改数组中的数据:
请添加图片描述

通常,数组名就是首元素地址,也可能是整个数组

4.野指针

野指针就是指针指向的位置是不可知的
原因:

  1. 指针未初始化,默认是随机值
  2. 指针越界访问,指针超过数组的长度时,它会变为随机值
  3. 指针指向的内存空间被释放

注意:全局指针指向局部变量或主程序中的指针指向函数中的变量时会报警告
指针最好初始化,可以int* p = NULL;

5.指针运算

①指针±整数
②指针-指针:不同类型的指针最好不要相减
③指针的关系运算:标准规定:允许指向数组元素的指针与指向数组最后一个元素的后一位的地址比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较,所以,不是所有编译器允许这种运算

6.二级指针

int a = 10;
int* pa = &a;
int** ppa = &pa

其中ppa就是二级指针,**ppa=10;

7.指针数组

定义指针数组:int* arr[3] = {&a, &b, &c};
输出指针数组指向的数据:
请添加图片描述

七.实用调试技巧

1.调试的步骤

  1. 发现程序错误的存在
  2. 以隔离、消除等方式对错误进行定位
  3. 确定错误产生的原因
  4. 提出纠正错误的解决办法
  5. 对程序错误予以改正,重新测试

system(“pause”);语句可以让代码在该语句中终止

2.debug和release

debug通常为调试版本,包含一些调试信息,可被调试,文件较大
release通常为发布版本,代码会被自动优化
请添加图片描述

注意:C语言中并没有内建的越界检查,因此开发者需要小心确保不要越界访问数组
assert头文件中的assert函数(断言),当条件不符合时,直接报错
代码实例:
请添加图片描述

对于常量,可以用改地址的对应的值来改值,所以一般对常量的地址也用const修饰
区分:const int* p(*p是常量)和int* const p(p是常量)

八.结构体

1.结构体的声明

struct tag
{member-list;
}全局的结构体变量;

结构体是一些值的集合,这些值可以是不同类型

2.结构体的初始化

①按顺序初始化:struct Person person1 = {“Alice”, 25};
②指定成员初始化:struct Person person2 = {.age = 30, .name = “Bob”};
③嵌套结构体的初始化:struct Student student1 = {“David”, {5, 8, 1999}};
④动态分配并初始化:

struct Person *person3 = malloc(sizeof(struct Person));
if (person3 != NULL) {person3->age = 22;strcpy(person3->name, "Charlie");
}

3.结构体传参

两种结构体传参方式:把结构体整个传过去,把结构体的地址传过去
把结构体整个传过去,压栈("压栈"通常指的是将数据存储到栈(stack)数据结构中的操作)消耗的内存过大
结论:建议把结构体的地址传过去

九.数据的存储

1.数据类型

整型家族:
char:unsigned char、signed char(ASCII码值,所以归类为整型)
short:unsigned short、signed short
int:unsigned int、signed int
long:unsigned long、signed long


浮点型家族:
float
double
long double


构造类型:
数组类型
结构体类型 struct
枚举类型 enum
联合类型 union


指针类型:
int*
char*
float*
void*


空类型:void(无类型)

2.整型在内存中的存储

计算机中的有符号数有三种表示方法,即原码、反码、补码
三种表示方法均有符号位和数值位,符号位为0则是正数
有符号数的二进制序列:原码
原码取反(除外符号位):反码
反码+1:补码
正数的原、反、补码都相同
对于整型,数据存放在内存中的是补码
大端存储模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中
小端存储模式:是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中
为什么有大端小端:寄存器宽度大于一个字节,那么必然存在着多个字节安排的问题,所以有大端小端的存储模式
判断当前机器的字节序的小程序:
请添加图片描述

注解:指针类型决定了指针解引用操作符能访问几个字节:char*访问1个字节,int*访问4个字节

printf格式控制符

%d:用于输出整型
%c:用于输出单个字符
%s:用于输出字符串
%f:用于输出浮点数
%u:用于输出无符号整数
%x:用于输出十六进制数
%o:用于输出八进制数
%p:用于输出指针地址

3.浮点数在内存中的存储

IEEE754规定:任意二进制浮点数V可表示为:-1s*M*2E
其中:

  1. -1^s表示符号位,当s=0,V为正数
  2. M表示有效数字
  3. 2^E表示指数位

IEEE754规定:对于32位的浮点数(单精度),最高的1位是位s,接着的8位是指数E,剩下的23位是数字位
对于64位的浮点数(双精度),最高的1位是位s,接着的11位是E,剩下的52位是数字位
对于有效数字M,M可以写成1.xxx的形式,其中xxxx表示小数部分
IEEE754规定,在计算机内部保存时,默认这个数的第一位总是1,因此可以省去
对于指数E,E是一个无符号整数,但是科学计数法中的E可能出现负数,所以IEEE754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127,对于11位的E,这个中间数是1023,比如2^10的E是10,所以保存为137,即10001001
例子:
float 5.5 -> 101.1 ->-10*1.011*22 -> S=0, M=1.011, E=2 -> 01000000101100000000000000000000 -> 0x40b00000
E取出来的三种情况:

  1. E不全为0且不全为1:先减127(或1023)得到真实值,再将有效数字M前加上第一位的1
  2. E全为0:E等于1-127即为真实值,M不再加上第一位的1,因为它本身就很接近0
  3. E全为1:如果有效数字M全为0,表示±无穷大(正负取决于符号位s)

十.指针详解

1.字符指针

字符指针:char*
一般使用:

char ch = 'w';
char* pc = &ch;
*pc = 'a';

非常规使用:

char *str = "Hello, world!";

在这种情况下,编译器会自动为字符串分配内存,并将其存储在程序的静态存储区域。因此,str 指向的是字符串的第一个字符的地址。
请注意,如果您尝试修改 str 指向的字符串,可能会导致未定义的行为。这是因为在大多数情况下,字符串存储在只读内存区域,因此尝试修改字符串的内容可能会导致程序崩溃或产生其他不可预测的结果。如果您需要修改字符串,应该使用字符数组而不是字符指针来存储它,建议用const修饰该str

2.指针数组

指针组成的数组叫指针数组
一般用法:

int arr1[] = {1, 2, 3};
int arr2[] = {2, 3, 4};
int arr3[] = {3, 4, 5};
int* parr[] = {arr1, arr2, arr3}

3.数组指针

数组指针是一个指针
定义一个数组指针:int(*p)[10] = arr;其中(*p)表示p是指针
数组指针的使用(一般数组指针用在二维以上数组):

int main(){int arr[3][5]={ {1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}, {3, 4, 5, 6, 7} };print2DArray(arr, 3, 5);return 0;
}
void print2DArray(int (*arr)[5], int rows, int cols) {for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {printf("%d ", arr[i][j]);}printf("\n");}
}
指针数组和数组指针的比较

int arr[5]; arr是一个5个元素的整形数组
int *parr1[5]; arr1是一个数组,数组有10个元素,每个元素的类型是int*,parr1是指针数组
int (*parr2)[10]; parr2是一个指针,该指针指向了一个数组,数组有10个元素,每个元素的类型是int,parr2是数组指针
int (*parr3[10])[5]; parr3是一个数组,该数组有10个元素,每个元素是一个数组指针,该数组指针指向的数组有5个元素,每个元素的类型是int

数组传参
图片消失了

以上方法均ok
请添加图片描述

上述方法中下四个方法中只有数组指针的那个是OK的
一级指针传参,传的可以是数组名取地址、一级指针
二级指针传参,传的可以是二级指针、一级指针取地址

4.函数指针

函数指针是指向函数的指针
定义一个函数指针:int (*pa)(int, int) = Add;
int是函数的返回类型,pa是指针名,(int, int)是函数的传参列表,Add是函数名
&函数名和函数名本身都是函数的地址
图片消失了

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

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

相关文章

怎么简单的把图片缩小?图片在线改大小的方法

在日常工作中经常需要在网上上传图片&#xff0c;但是一般网上不同的平台对上传的图片大小和尺寸都会有限定的要求&#xff0c;不符合要求无法正常上传使用。所以当遇到图片太大的问题时&#xff0c;该如何快速修改图片大小&#xff0c;有很多的小伙伴都很关注这个问题的解决方…

【Qt秘籍】[002]-开始你的Qt之旅-下载

一、Qt的开发工具有哪些&#xff1f; Qt的开发工具概述Qt支持多种开发工具&#xff0c;其中最常见的开发工具是 1.QtCreator 【易上手/有少量bug/适合新手】 2.VisualStudio 【功能强大/易出错/需要更多额外配置】 3.Eclipse 【清朝老兵IDE/不建议使用】 【注意&#xff1…

【第三节】类的构造和析构函数

目录 一、数据成员的初始化 二、构造函数 2.1 什么是构造函数 2.2 构造函数的注意事项 三、析构函数 四、带参数的构造函数 五、缺省构造函数 六、构造函数初始化列表 七、拷贝构造函数和调用规则 八、深拷贝和浅拷贝 九、总结 一、数据成员的初始化 定义普通变量&am…

基于BP神经网络和小波变换特征提取的烟草香型分类算法matlab仿真,分为浓香型,清香型和中间香型

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...................................................................................... …

深入探究Java自动拆箱与装箱的实现原理

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

Linux:进程控制(二.详细讲解进程程序替换)

上次讲了&#xff1a;Linux&#xff1a;进程地址空间、进程控制&#xff08;一.进程创建、进程终止、进程等待&#xff09; 文章目录 1.进程程序替换1.1概念1.2原理1.3使用一个exec 系列函数execl&#xff08;&#xff09;函数结论与细节 2.多进程时的程序替换3.其他几个exec系…

mysql连接池的实现

概要&#xff1a;本文介绍mysql连接池的实现&#xff0c;要求读者了解线程池 一、为什么需要mysql连接池&#xff1f; 资源复用 &#xff1a;不使用连接池&#xff0c;每次数据库请求都新建一条连接&#xff0c;将耗费系 统资源。 流程如下&#xff1a; 通过三次握手建立 TC…

大数据面试题 —— Hive

目录 Hive 是什么为什么要使用 HiveHive 的优缺点Hive的实现逻辑&#xff0c;为什么处理小表延迟比较高你可以说一下 HQL 转换为 MR 的任务流程吗 ***你可以说一下 hive 的元数据保存在哪里吗 ***Hive与传统数据库之间的区别Hive内部表和外部表的区别 ***hive 动态分区与静态分…

Hotcoin Research | 市场洞察:2024年5月13日-5月19日

加密货币市场表现 目前&#xff0c;加密货币总市值为1.32万亿&#xff0c;BTC占比54.41%。 本周行情呈现震荡上行的态势&#xff0c;BTC在5月15日-16日&#xff0c;有一波大的拉升&#xff0c;周末为震荡行情。BTC现价为67125美元。 上涨的主要原因&#xff1a;美国4月CPI为3…

效率工作:一键为多种资产添加统一材质(小插件)

1.需求分析&#xff1a; 当导入一批资产&#xff0c;或者有同一批结构体需要添加相同材质时&#xff0c;单独为每个模型都添加材质费时费力&#xff0c;有没有什么办法&#xff0c;能同时为多个资产添加材质。 2.操作实现 1.在网上找到了一款插件&#xff0c;经过验证&#xf…

如何将天猫内容保存为PDF格式?详细步骤与实战解析

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;保存天猫内容的重要性 二、环境准备与工具安装 1. 安装必要的Python包…

SpringCloud之SSO单点登录-基于Gateway和OAuth2的跨系统统一认证和鉴权详解

单点登录&#xff08;SSO&#xff09;是一种身份验证过程&#xff0c;允许用户通过一次登录访问多个系统。本文将深入解析单点登录的原理&#xff0c;并详细介绍如何在Spring Cloud环境中实现单点登录。通过具体的架构图和代码示例&#xff0c;我们将展示SSO的工作机制和优势&a…

HCIP-Datacom-ARST自选题库__BGP多选【22道题】

1.BGP认证可以防止非法路由器与BGP路由器建立邻居&#xff0c;BGP认证可以分为MD5认证和Keychain认证&#xff0c;请问以下哪些BGP报文会携带BCGP Keychain认证信息?(报头携带) open Update Notication Keepalive 2.传统的BGP-4只能管理IPv4单播路由信息&#xff0c;MP-B…

Spring-Cloud-OpenFeign源码解析-04-调用流程分析

在Spring-Cloud-OpenFeign源码解析-03-FeignClientFactoryBean分析到&#xff0c;通过Autowired或者Resource注入FeignClient实例的时候&#xff0c;实际上返回的是JDK动态代理对象&#xff0c;具体的实现逻辑在InvocationHandler的invoke方法中 回看ReflectiveFeign.newInsta…

AI大模型日报#0528:Greg专访 | 为什么OpenAI最先做出GPT-4、xAI获60亿美元融资、李飞飞经典对话Hinton

导读&#xff1a;AI大模型日报&#xff0c;爬虫LLM自动生成&#xff0c;一文览尽每日AI大模型要点资讯&#xff01;目前采用“文心一言”&#xff08;ERNIE 4.0&#xff09;、“零一万物”&#xff08;Yi-34B&#xff09;生成了今日要点以及每条资讯的摘要。欢迎阅读&#xff0…

YOLOv8/YOLOv7/YOLOv5+CRNN-车牌识别、车牌关键点定位、车牌检测(毕业设计)

目录 一、前言1、项目介绍2、图片测试效果展示 二、项目环境配置1、pytorch安装&#xff08;gpu版本和cpu版本的安装)2、pycocotools的安装3、其他包的安装 三、yolov8/yolov7/yolov5CRNN-中文车牌识别、车牌关键点定位、车牌检测算法1、yolov8算法介绍2、CRNN算法介绍3、算法流…

【加密与解密(第四版)】第十三章笔记

第十三章 HOOK技术 13.1 Hook概述 IAT HOOK&#xff08;改地址&#xff09; BOOL IAT_InstallHook(){BOOL bResult FALSE ;HMODULE hCurExe GetModuleHandle(NULL);PULONG_PTR pt ;ULONG_PTR OrginalAddr;bResult InstallModuleIATHook(hCurExe,"user32.dll",&qu…

韩顺平0基础学Java——第13天

p264-p284 安装IDEA&#xff0c;熟悉一下软件。 尴尬了&#xff0c;难道是这个版本的idea不支持jdk17&#xff0c;难受住了 成功了&#xff0c;顺便跑一下昨天的作业&#xff1a; 这都要跑2秒&#xff1f;是电脑的问题还是谁的问题&#xff1f;控制台里跑的好快的哦 设置id…

Thingsboard规则链:Message type switch节点详解

在物联网解决方案中&#xff0c;数据的高效处理与自动化决策流程是实现智能化管理的基础。Thingsboard&#xff0c;作为一个强大的开源物联网平台&#xff0c;通过其规则引擎为用户提供了一系列灵活的节点来定制复杂的业务逻辑。其中&#xff0c;Message Type Switch节点是构建…

BookxNote Pro 宝藏 PDF 笔记软件

一、简介 1、BookxNote Pro 是一款专为电子书阅读和学习笔记设计的软件&#xff0c;支持多种电子书格式&#xff0c;如PDF和EPUB&#xff0c;能够帮助用户高效地管理和阅读电子书籍&#xff0c;同时具备强大的笔记功能&#xff0c;允许用户对书籍内容进行标注、摘录和思维导图绘…