Cweek2+3

news2024/12/28 21:54:43

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.coloradmin.cn/o/1711003.html

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

相关文章

基础技术-ELF系列2-ELF文件进阶与libelf库

成就更好的自己 本篇是基础技术系列中ELF相关技术的第二篇&#xff0c;将会详细介绍一下ELF文件的结构。 没有看过之前的文章的朋友请重新开始&#xff0c;博主观点比较清奇&#xff0c;否则可能会有一些不太明白的地方&#xff1a; 基础技术-ELF系列(1)-ELF文件基础-CSDN博…

【设计模式】JAVA Design Patterns——Data Transfer Object(数据传递对象模式)

&#x1f50d;目的 次将具有多个属性的数据从客户端传递到服务器&#xff0c;以避免多次调用远程服务器 &#x1f50d;解释 真实世界例子 我们需要从远程数据库中获取有关客户的信息。 我们不使用一次查询一个属性&#xff0c;而是使用DTO一次传送所有相关属性。 通俗描述 使用…

pytorch-16 复现经典网络:LeNet5与AlexNet

一、相关概念 对于&#xff08;10,3,227,227&#xff09;数据表示&#xff0c;10张3通道的图&#xff0c;图的大小&#xff08;特征数&#xff09;为227*227. 通道数&#xff1a;作为卷积的输入通道数和输出通道数。 特征数&#xff1a;特征图的大小 步长stride和填充padding&…

文章结尾,铺垫下一章带来的期待

你是否容易在阅读时打瞌睡? 是否有很多买回来的书,放在书架上一年甚至几年都未读完,积满了灰尘? 但是,对于小说和电视剧,你却完全停不下来。每集片尾的预告激发了你持续观看下一集的渴望,带来了无限的期待…… 当你撰写文章或编写工具书时,内容可能呈现出乏味的面貌…

二叉树习题精讲-单值二叉树

单值二叉树 965. 单值二叉树 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/univalued-binary-tree/description/ 判断这里面的所有数值是不是一样 方案1&#xff1a;遍历 方案2&#xff1a;拆分子问题 /*** Definition for a binary tree node.* struc…

数据库自动化管理的六大等级

什么是数据库自动化管理&#xff1f; 数据库自动化管理是指通过使用工具和流程&#xff0c;在尽量减少人为干预的情况下&#xff0c;管理和执行与数据库相关的任务。主要目的当然是提高效率&#xff0c;减少人为错误&#xff0c;确保一致性&#xff0c;并解放 DBA 和开发者&am…

系统思考—决策

风险来自于你不知道你在做什么。——沃伦巴菲特 今天和一个合作伙伴的创始人交流&#xff0c;她提出了一个引人深思的问题&#xff1a;“策略性陪伴和战略复盘&#xff0c;什么原因不由客户自己来做&#xff1f;”这个问题让我深入思考了第三方策略性陪伴顾问的独特价值和重要…

《征服数据结构》块状链表

摘要&#xff1a; 1&#xff0c;块状链表的介绍 2&#xff0c;块状链表的代码实现&#xff08;Java和C&#xff09; 1&#xff0c;块状链表的介绍 前面我们讲过数组和链表&#xff0c;数组具有 O(1)的查询时间&#xff0c;O(N)的删除&#xff0c;O(N)的插入&#xff0c;而链表具…

java 对接农行支付相关业务(二)

文章目录 农行掌银集成第三方APP1:掌银支付对接快e通的流程1.1 在农行网站上注册我们的app信息([网址](https://openbank.abchina.com/Portal/index/index.html))1.2:java整合农行的jar包依赖1.3:把相关配置信息整合到项目中1.4:前端获取授权码信息1.5:后端根据授权码信…

Unity【入门】环境搭建、界面基础、工作原理

Unity环境搭建、界面基础、工作原理 Unity环境搭建 文章目录 Unity环境搭建1、Unity引擎概念1、什么是游戏引擎2、游戏引擎对于我们的意义3、如何学习游戏引擎 2、软件下载和安装3、新工程和工程文件夹 Unity界面基础1、Scene场景和Hierarchy层级窗口1、窗口布局2、Hierarchy层…

Spring Cloud Alibaba-06-Sleuth链路追踪

Lison <dreamlison163.com>, v1.0.0, 2024.4.03 Spring Cloud Alibaba-06-Sleuth链路追踪 文章目录 Spring Cloud Alibaba-06-Sleuth链路追踪为什么使用链路追踪常见链路追踪解决方案Sleuth概述概述Sleuth术语 Sleuth Zipkin 原理Sleuth原理简述Zipkin 原理简述 Sleut…

剪画小程序:自媒体创作的第一步:如何将视频中的文案提取出来?

自媒体创作第一步&#xff0c;文案提取无疑是至关重要的一环。 做自媒体之所以要进行文案提取&#xff0c;有以下重要原因&#xff1a; 首先&#xff0c;提高效率。通过文案提取&#xff0c;可以快速获取关键信息&#xff0c;避免在无关紧要的内容上浪费时间&#xff0c;从而…

OpenEuler安装

1.下载镜像文件 2.新建虚拟机 版本选替他linux5.x内核64位 内存选4G 磁盘大小选40GB 内存和磁盘大小不能按默认&#xff0c;不然会很卡甚至没反应 优先使用英语 安装目的地一开始会有警告标志&#xff0c;点进去点完成 输入密码时不能太短还要保证拥有至少三种字符类型 等待安…

【数据结构】AVL树——平衡二叉搜索树

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 目录 二叉搜索树 AVL树概述 平衡因子 旋转情况分类 左单旋 右单旋 左右双旋 右左双旋 AVL树节点设计 AVL树设计 详解单旋 左单旋 右单旋 详解双旋 左右双旋 平衡因子情况如…

基于微信小程序+ JAVA后端实现的【微信小程序跑腿平台】设计与实现 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称&#xff1a; 《微信小程序跑腿平台的设计与实现》 项目技术栈 该项目采用了以下核心技术栈&#xff1a; 后端框架/库&#xff1a; Java, SSM框架数据库&#xff1a; MySQL前端技术&#xff1a; 微信小程序, HTML…&#xff08;其它相关技术&#xff09; …

.BFS.

BFS &#xff08;Breadth-First Search&#xff09;是一种用于遍历或搜索树&#xff08;tree&#xff09;或图&#xff08;graph&#xff09;的算法。 这个算法从根&#xff08;或某个任意节点&#xff09;开始&#xff0c;并探索最近的邻居节点&#xff0c; 然后再探索那些节点…

adb的常见操作和命令

最近学习adb的时候&#xff0c;整理了一些adb的使用场景&#xff0c;如&#xff1a;adb与设备交互&#xff0c;adb的安装、卸载&#xff0c;adb命令启动&#xff0c;通过命令清除缓存&#xff0c;文件传输和日志操作。 adb的两大作用&#xff1a;在app测试的时候可以提供监控日…

如何高效测试防火墙的NAT64与ALG应用协议转换能力

在本文开始介绍如何去验证防火墙&#xff08;DUT&#xff09;支持NAT64 ALG应用协议转换能力之前&#xff0c;我们先要简单了解2个比较重要的知识点&#xff0c;即&#xff0c;NAT64和ALG这两个家伙到底是什么&#xff1f; 网络世界中的“翻译官” - NAT64技术 简而言之&…

【Linux安全】iptables防火墙(二)

目录 一.iptables规则的保存 1.保存规则 2.还原规则 3.保存为默认规则 二.SNAT的策略及应用 1.SNAT策略的典型应用环境 2.SNAT策略的原理 2.1.未进行SNAT转换后的情况 2.2.进行SNAT转换后的情况 3.SNAT策略的应用 3.1.前提条件 3.2.实现方法 三.DNAT策略及应用 1…

学习笔记——数据通信基础——数据通信网络(网络工程师)

网络工程师 网络工程&#xff0c;就是围绕着网络进行的一系列的活动&#xff0c;包括∶网络规划、设计、实施、调试、排错等。网络工程设计的知识领域很宽广&#xff0c;其中路由和交换是计算机网络的基本。 网络工程师∶是在网络工程领域&#xff0c;掌握专业的网络技术&…