C和指针(二)数据
数据类型
1,C语言中仅有四种基本数据类型——整型、浮点型、指针、聚合类型(数组、结构等)。
2,整型包括字符、短整型、整型、长整型,且可以分为有符号和无符号两种版本。
1)长整型至少和整型一样长,整型至少和短整型一样长。大小由编绎器决定。
3,设计char类型变量是为了容纳字符型值,本质上是小整型值。
1)缺省char是signed char或unsigned char取决于编绎器。
2)不同编绎器取值范围不同不利于程序移植,显式声明char为signed或unsigned可提高程序的可移植性,可确保不同机器中字符符号值保持一致。
3)但有些机器处理signed char比unsigned char高效,并且处理字符的库函数参数声明为char,显式声明unsigned或signed可能带来兼容性问题。
4)当可移值问题比较重要时,最佳方案将char型变量值限制在signed char和unsigned char交集内,这样可获得最大可移植性,同时不失效率。
4,字面值即字面值常量,指定值且不允许改变。
1)字面值后添加L或l后缀表long整型,添加U或u后缀表unsigned整型,各添加一个表unsigned long整型。
2)字面值缺省情况下是能完整容纳这个值的最短类型。
5,字符常量是单引号包围的单个字符、转义字符、三字母词,类型是int。
1)多字节字符常量前L表宽字符常量。
6,负数常量不是字面值常量,而是常量表达式,负号表单目操作符不是数值一部分。
7,当字面值确定字中某些特定位的位置时,写成十六进制或八进制更合适,例0xF0等。
8,枚举类型值为符号常量而不是字面值,变量实际以整型方式存储。
9,浮点类型通常以一个分数以及一个以某个假定数为基数的指数组成,包括float、double、long double类型。
1)表示浮点值的方法有很多,标准未规定必须使用特定格式。
2)标准规定long double至少和double一样长,double至少和float一样长。
3)标准规定了所有浮点类型至少能够容纳-1037到1037之间的值。
10,C不存在字符串类型,但提供了字符串常量,一串以NUL字节结尾的零个或多个字符,通常存储在字符数组中。
1)字符串常量不允许修改,程序中不同位置同一个字符串常量存储在同一个内存,在某处修改字符串常量会影响其他位置字符串常量。
2)当字符串常量出现在表达式中,表示的是字符串存储的地址,可以把字符串常量赋值给指向字符的指针,但不能把字符串常量赋值给字符数组,此时字符串常量并不代表字符本身。
3)标准C函数库提供了一组操作字符串复制、连接、比较、计算长度、查找特定字符的函数。
声明
1,声明说明符包含了关键字,用于描述声明的基本类型。
1)说明符也可以改变标识符的缺省存储类型和作用域,例short、long、signed、unsigned。
2)声明整型变量时,声明中已经至少有了一个其他的说明符,关键字int可以省略。
3)signed一般用于char类型,其他整型缺省情况下都是有符号数,char是否是signed则由编绎器决定。
2,声明一维数组需要指定数组元素个数,编绎器不检查数组下标的越界,实际编程中注意溢出。
3,声明指针*紧跟变量名前,一条语句声明多个指针每个变量名前紧跟*,否则就变成指针指向的类型。
例:
char *message = “hello world”;
等同于
char *message;
message = “hello world”;
3,函数如果不显式声明返回值类型,默认返回整型,省略形参类型时,编绎器默认为整型。
4,C语言支持typedef为数据类型定义新名称,应用于复杂较长的声明,并且修改一处所有生效。5,#define不能正确处理指针类型,需要使用typedef代替创建指针类型。
6,使用const关键字声明常量,常量不可修改,声明时初始化,声明为const的形参在函数调用时由实参初始化。
常量
1,指针常量和常量指针。
1)指针常量是指针本身是个常量,声明时初始化不可修改指针指向,可通过指针修改指向的内容。
2)常量指针是指针指向的内容是常量,可修改指针指向,不可通过指针修改指向内容。
2,#define也可以创建名字常量,允许使用字面值常量的地方都可以使用define的名称代替,但define没有类型检查。
3,const变量只能用在允许使用变量的地方,当常量应用于程序多处时修改一个名字常量比搜索整个程序修改字面值常量容易,提高了程序的可维护性。
作用域
1,编绎器确定4种不同类型的作用域:文件作用域、函数作用域、代码作用域、原型作用域。
2,代码块作用域即代码所在花括号的区域,声明于内层代码块标识符的作用域在代码块尾部结束,且内层代码块标识符隐藏外层相同名称的标识符,无法通过名字访问外层相同名称的标识符。
1)无重叠作用域的代码块可以共享同一块内存地址,任何时刻最多只会有一个处于活动状态。
2)函数形参的作用域是整个函数体,声明于函数最外层作用域的局部变量不可与形参同名。
3,声明于所有代码块之外的标识符具有文件作用域,作用域起始于声明处终止于文件结尾。
1)在文件中定义的函数也具有文件作用域,函数不属于任何代码块。
2)在头文件声明并#include到其他文件的函数具有其他文件的文件作用域,作用域不仅限于头文件尾。
4,原型作用域只适用于函数声明中的形参,参数名字非必需,且不必与函数定义中形参匹配,也不必与函数调用中实参匹配。
5,函数作用域只适用于语句标签goto语句,函数中所有语句标签必须唯一。
链接属性
1,程序中源文件编绎成目标文件,链接器链接目标文件生成可执行程序,不同源文件中相同标识符具有不同的链接属性。
2,链接属性分为外部(external)、内部(internal)、无(none)。
1)无链接属性的相同标识符为独立的实体。
2)内部链接属性的相同标识符在同个源文件中指向同一个实体,在不同源文件分属不同的实体。
3)外部链接属性的相同标识符在不同源文件中表示同一个实体。
3,关键字extern和static声明时可修改链接属性。
1)具有外部链接属性的标识符声明时加上static则链接属性变为内部链接属性,标识符为当前源文件私有,static只对缺省为外部链接属性的标识符生效。
2)extern作用于标识符的第一次声明时可指定标识符为外部链接属性,如果用于该标识符的第2次及以后的声明,不会改变该标识符第一次声明时static指定的链接属性,当标识符具有文件作用域时,可省略该关键字。
存储类型
1,变量存储类型指存储变量值时的内存类型,取决于变量的创建、销毁、保持,通常存储在普通内存、运行时堆栈、硬件寄存器。
1)声明于所有代码块之外的变量存储于静态内存,程序运行之前创建,在程序整个执行期间存在。
2)代码块内部声明的变量缺省为自动变量存储在堆栈,关键字auto修饰该存储类型,但极少使用,程序执行声明时创建变量,离开代码块时销毁。
3)关键字register用于自动变量声明,存储变量于硬件寄存器。
2,代码块内部变量声明时加上static则由自动类型变为静态类型,修改存储类型不修改作用域,只可在代码块内部按名字访问。
1)函数形参不可声明为静态类型,函数支持递归外层形参会被下一层调用修改。
3,寄存器访问比内存访问高效,但不能太多,编绎器有一套寄存器优化方法,可能忽略register关键字,按普通自动变量处理。
1)典型情况下,将使用频率最高的变量声明为寄存器变量,或将指针声明为寄存器变量可提高程序效率,尤其是频繁执行间接访问的指针。
2)寄存器变量创建和销毁时间和自动变量相同,但需要做一些额外工作。
3)当前使用寄存器变量的函数在返回前,需要将寄存器的值恢复到函数调用之前,使用运行时堆栈完成恢复,进入函数前,将所有使用的寄存器内容保存到堆栈,函数返回时将堆栈内容恢复到寄存器。
初始化
1,程序编绎时将静态变量初始值存储在静态内存,程序加载后将静态内存中初始值赋值给静态变量。
1)只需要初始化一次。
2)静态变量初始化和使用不需要额外时间和额外指令。
3)不显式指定初始值时,默认初始化为0。
2,自动变量初始化需要更多开销,因程序链接时不确定自动变量的存储位置,函数的局部变量每次调用可能占用不同的内存位置。
1)自动变量没有缺省值,需要显式的在声明时初始化,或在使用前赋值。
2)除了声明为const的变量必须初始化,自动变量初始化和赋值无差别。
3)函数内自动变量每次调用都需要重新初始化,初始化在运行时执行,可以用任何表达式作为初始化值。
static关键字
1,当关键字作用于函数定义和代码块之外变量声明时,static修改标识符的链接属性,从外部链接修改为内部链接,存储类型和作用域不受影响,只能在当前源文件访问。
2,当关键字作用于代码块内部变量声明时,static修改变量存储类型,从自动变量修改为静态变量,链接属性和作用域不受影响,程序执行前创建,程序结束销毁。
3,变量声明于代码块之外缺省具有外部链接属性,所有源文件都可以访问,变量声明于代码块内,extern关键字表示引用全局变量而非声明局部变量。
4,外部链接属性的变量具有静态存储类型,程序开始前创建,程序结束销毁。
5,函数内部局部变量在函数开始时创建,函数返回销毁,但用于执行函数的机器指令在程序生命期内一直存在。
6,局部变量不能被其他函数通过名字引用,缺省情况下为自动存储类型,使用时才分配内存,可以减少内存总需求量。
1)在堆栈分配内存可以有效实现递归。
2)如果变量的值在多次调用中需要保存原先值或最终值,可以修改存储类型为静态变量。
相关文章:

C和指针(二)数据
数据类型 1,C语言中仅有四种基本数据类型——整型、浮点型、指针、聚合类型(数组、结构等)。 2,整型包括字符、短整型、整型、长整型,且可以分为有符号和无符号两种版本。 1)长整型至少和整型一样长&#…...

PyTorch基础学习(一)
一.简介 PyTorch是一个基于Python的开源机器学习框架,它提供了丰富的工具和接口,用于构建和训练深度学习模型。PyTorch的主要特点包括: 动态计算图: PyTorch使用动态计算图,这意味着在模型构建过程中可以实时地进行计…...

chatgpt赋能python:Python代做:让您的网站更友好的SEO利器
Python代做:让您的网站更友好的SEO利器 如果您是一位网站管理员或者SEO工程师,您一定知道SEO对于网站的重要性。那么在SEO中,Python代做可以为您提供什么?在本文中,我们将通过介绍Python代做的技术和方法,…...

2022年都快结束了,还有人不会安卓录屏?在安卓上录制屏幕的的实现方式
前言 在我之前的文章 《以不同的形式在安卓中创建GIF动图》 中,我挖了一个坑,可以通过录制屏幕后转为 GIF 的方式来创建 GIF。只是当时我只是提了这么一个思路,并没有给出录屏的方式,所以本文的内容就是教大家如何通过调用系统 A…...

px rem em rpx 区别 用法
任意浏览器的默认字体高都是16px。所有未经调整的浏览器都符合: 1em16px。那么12px0.75em,10px0.625em。为了简化font-size的换算,需要在css中的body选择器中声明Font-size62.5%,这就使em值变为 16px*62.5%10px, 这样12px1.2em, 10px1em, 也就是说只需要…...

忆享聚焦|ChatGPT、AI、网络数字、游戏……近期热点资讯一览
“忆享聚焦”栏目第十四期来啦!本栏目汇集近期互联网最新资讯,聚焦前沿科技,关注行业发展动态,筛选高质量讯息,拓宽用户视野,让您以最低的时间成本获取最有价值的行业资讯。 目录 行业资讯 1.科技部部长王志…...

[Daimayuan] 树(C++,动态规划,01背包方案数)
有一棵 n n n 个节点的以 1 1 1 号点为根的有根树。现在可以对这棵树进行若干次操作,每一次操作可以选择树上的一个点然后删掉连接这个点和它的儿子的所有边。 现在我们想知道对于每一个 k k k ( 1 ≤ k ≤ n 1≤k≤n 1≤k≤n),最少需要多少次操作能…...

如何选择源代码加密软件
(SDC沙盒)和DLP、文档加密、云桌面等,其优缺点做客观比较如下: 比较内容安全容器(SDC沙盒)DLP文档加密云桌面代表厂家*信达卖咖啡、赛门贴科亿*通、IP噶德、*盾、*途四杰、深*服设计理念以隔离容器加准入技术为基础,构…...

TO-B类软件产品差异化
产品差异化,是在市场众多同质化产品中,突出自身产品亮点的重要方式。对于客户来讲其选择是多种多样的,与其花费大量的时间研究每一家产品的特点,还不如直接选择品牌更大、价格更低的产品来的直接,因此显而易见的突出产…...

设计模式之美-实战一(上):业务开发常用的基于贫血模型的MVC架构违背OOP吗?
领域驱动设计(Domain Driven Design,简称DDD)盛行之后,这种基于贫血模型的传统的开发模式就更加被人诟病。而基于充血模型的DDD开发模式越来越被人提倡。所以,我打算用两节课的时间,结合一个虚拟钱包系统的…...

ChatGPT如何训练自己的模型
ChatGPT是一种自然语言处理模型,它的任务是生成自然流畅的对话。如果想要训练自己的ChatGPT模型,需要进行大量的数据收集、预处理、配置训练环境、模型训练、模型评估等过程。本文将详细介绍这些过程,帮助读者了解如何训练一个高品质的ChatGP…...

springboot使用线程池的实际应用(一)
在实际Spring Boot项目中,我们可以使用Java的原生多线程或者使用Spring自带的线程池进行多线程编程。多线程的好处在于能够提高应用程序的运行效率,特别是在某些计算密集型场景下。以下是一些使用多线程的典型场景: 并发处理请求:…...

ESP-8266学习笔记
1、学习地址 【XMF09F系列资源】基于MicroPython的ESP8266物联网应用开发-赛教资源目录汇总-小蜜蜂笔记 Quick reference for the ESP8266 — MicroPython latest documentation 2、MicroPython及相关开发资源 3、固件烧录与uPyLoader的使用 烧录教程参考: https://www.…...

Java泛型简单的使用
前言 Java里面的泛型在实际开发中运用的很多,学过C的同学一定知道C的模板,而Java中的泛型,一定程度上和它还是挺像的。 相信写Java的人,大都有用过List的实现类ArrayList。在Java没有泛型之前,它的内部是一个Object的…...

深度探索:Qt CMake工程编译后的自动打包策略
深度探索:Qt CMake工程编译后的自动打包策略 1. 引言(Introduction)1.1 Qt和CMake的基本概念(Basic Concepts of Qt and CMake)1.2 自动打包的重要性(Importance of Automatic Packaging) 2. Qt…...

2.7 编译型和解释型
2.7 编译型和解释型 前面我们使用java和javac命令把Hello,World!在控制台输出。那为什么输出,这里我们需要掌握两个知识点。编译型语言和解释型语言。在计算机的高级编程语言就分为编译型语言和解释型语言。而我们的Java既有编译型的特点也有…...

校园网自动登陆(河南科技学院)
1. 介绍 河南科技学院校园网自动登陆(新乡的很多系统相似,可能也可以用?),java版。可以实现电脑,路由器,软路由的自动认证wifi,后续会上传docker版本的。 源码地址 github:https://…...

C++11 override和final关键字
C11中的override和final关键字是为了增强代码的编译时类型检查和面向对象设计中的继承机制。 override关键字用于显示地表明派生类中的成员函数覆盖了基类中的虚函数。当派生类中的函数与基类中的虚函数签名不同或者没有使用override关键字时,编译器会给出警告或错…...

kafka的log存储解析
kafka的log存储解析——topic的分区partition分段segment以及索引等 引言Kafka中的Message是以topic为基本单位组织的,不同的topic之间是相互独立的。每个topic又可以分成几个不同的partition(每个topic有几个partition是在创建topic时指定 的),每个…...

4.文件系统
组成 Linux:一切皆文件 索引节点(I-node) I-node(Index Node):文件系统的内部数据结构,用于管理文件的元数据和数据块。 文件的元数据:包括文件的权限、拥有者、大小、时间戳、索引…...

Shell脚本case in esac分支语句应用
记录:434 场景:Shell脚本case in esac分支语句应用。 版本:CentOS Linux release 7.9.2009。 1.case in esac格式 格式: case 值 in 模式1)expression;; 模式2)expression;; 模式n)expression;; esac 解析:case…...

【线性dp必学四道题】线性dp四道经典例题【最长上升子序列】、【最长公共子序列】、【最长公共上升子序列(maxv的由来)】【最长公共子串】
【最长上升子序列】、【最长公共子序列】、【最长公共上升子序列】 最长上升子序列f[i] 表示以i结尾的最长子序列 最长公共子序列f[i][j] 表示 a前i 和 b前j个 最长公共长度 最长公共上升子序列f[i][j]代表所有a[1 ~ i]和b[1 ~ j]中以b[j]结尾的公共上升子序列的集合 最长公共子…...

追寻幸福:探索幸福的关键特征和行为
目录 1. 积极的心态 2. 良好的人际关系 3. 自我接纳和自尊 4. 追求意义和目标 5. 健康的身心状态 6. 感知和实现个人价值 幸福是一个主观的感受,因此不同的人对于幸福的定义和追求方式可能会有所不同。然而,有一些共同的特点和行为模式,…...

Redis-02-集群
一、redis5搭建集群 1.1、案例:搭建6台redis主机,配置如下 redis并发量:https://www.gxlcms.com/redis-350423.html主机IP:192.168.168.60~65修改redis配置文件hash槽移动,槽内的数据也随之移动 [root60 ~]# vim /e…...

【2023 · CANN训练营第一季】MindSpore模型快速调优攻略 第三章——MindSpore云上调试调优
1.ModelArts云上调试调优 ModelArts密钥初始化 详细教程: 初始化OBS服务 创建训练作业 2.MindSpore IDE插件效率提升 通过智能代码块推荐、代码自动补全等特性,提升MindSpore脚本开发效率,对接ModelArts云服务,实现模型训…...

python笔记17_实例演练_二手车折旧分析p2
…… 书接上文 4.车辆等级维度 探查车龄为5年的车辆,折旧价值与车辆等级的关系。 # 筛选出车龄为5的数据创建新表 data_age5 data[data[age] 5] data_age5 # 分组聚合计算均值 data_car_level data_age5.groupby(car_level_name)[lowest_price].mean().reset…...

android 12.0长按Power弹出关机对话框去掉屏幕截图和紧急呼救功能
1.概述 在12.0的系统长按关机键,会弹出关机的对话框,关机对话框里面由关机重启截图和紧急呼叫等功能,而由于开发功能需求要求去掉屏幕截图和紧急呼叫等功能,所以就要先找到关机对框的代码 然后实现功能 功能分析: 长按电源键弹出关机对话框,通过adb shell命令发现 就是f…...

2023年下半年软考高级需要报班吗?
首先,对于软考高级考试报班与否的问题,需要根据自身的情况来做出决定。如果你有较强的自学能力,且具备丰富的实际工作经验和技术知识,那么不报班也完全可以自学备考。但如果你对软件工程的知识掌握程度较低,或者时间紧…...

使用WordPress提高企业敏捷性
喜欢WordPress的原因有很多:该平台非常适合内容管理以及控制预算。此外, 在 提高开发效率和简化项目管理方面,WordPress可以通过多种方式提供帮助。 对于任何企业业务,目标始终是在不影响质量的情况下更快地启动项目、发布修复和…...

SSM编程---Day 07
目录 SpringMVC 一、概念 二、springMVC的请求处理流程 三、mvc:annotation-driven 标签的作用 四、HandlerMapping、Handler和HandlerAdapter的介绍 五、SpringMVC 体系结构 六、SpringMVC的常用注解 七、view和controller之间的传值 SpringMVC 一、概念 1、 Spring…...