首页 > 其他分享 >复习C语言小问题

复习C语言小问题

时间:2023-05-21 21:44:25浏览次数:32  
标签:类型转换 复习 int C语言 问题 cast 内存 变量 指针

1:强制类型转换的问题

2:空间配置器的原理以及作用。

3:复习

C语言是支持隐式类型的转换的,但是这个转换的过程比较的“简陋”只用一个赋值运算符就完事了,但是有些类型转换是比较危险的,比如静态变量强制转换位非静态变量,因为静态变量存在寄存器中,编译器取的时候是寄存器中取得,如果用指针转换成普通类类型了,系统就会去内存中取这个变量,然而寄存器中的这个变量并没有变,就会出错。

比如定义一个const int i=19;然后将他的指针强转成普通的int此时然后解引用指针改变i的值,打印这时会发现变量i没有改变。如下图:

 变量i还是10没变,这是因为编译器从寄存器取东西的结果,此时只需要用volatile修饰这个静态变量就可以让编译器去内存中读取i变量了。如下:

 上面的类型转换是相对而言比较危险的,其他的数据类型向下转换也有一定的精度丢失。

所以c++中规范了这样的转换过程:

static_cast:隐式类型转换专用:格式static_cast<void>(void elem);

reinterpret_cast:强制类型转换,格式同上。

const_cast:去除const修饰。格式同上。dynamic_cast:这是向上兼容,用于类的转换,一般用于派生类转换为基类;多态中的基类引用或者指向派生类的指针。也是这个原理。

dynamic是通过虚表来判断这个是否可以强转的,所以必须有虚函数才能使用。

空间适配器:

一个程序在运行时肯定会有很多地方需要申请堆内存,然而内核是很忙的,它需要管理很多个程序进程的空间申请和释放问题,如果程序每次都为一点点内存就去跑去问内核要内存,这大大影响了效率,而且这些内存切片了后再还回去就是碎片内存了,这些内存又很小,而且地址又不连续基本就属于不能用的内存碎片,于是就设计了内存池,这个程序一次把内存申请够,用的时候直接切,就不会有这么多事了。但是切到的这些小内存又很难管理于是就用哈希捅管理这些内存。

一般内存池分为一级和二级,一级很简单就是一个malloc函数申请一块空间,这是程序需要的较大的内存,去直接申请的内存,而二级内存池,就是用的一次申请好的内存,使用的时候切下来好几个挂在哈希桶上,用的时候用,不用的时候又挂回去。这样的设计不仅解决了内存申请的效率问题,又解决了碎片化内存过多的问题。

数组指针的定义方式:int*(*parr)[10];这是一个存入类型为整形指针的名字为parr的数组的指针。、

函数指针的定义方式与数组指针的方式很像,int(*fun)(int int);这是一个返回值类型为整形的名字为fun的函数指针,他有两个整形参数。

strlen和sizeof,strlen求字符串的长度他不将/0算入其中,而sizeof计算字符串本身的大小。

memmove和memcpy   memcpy可以复制内存数据,但是如果两个串要复制的地方重合了,这个就坏了。必须要用memmove来解决这个问题。因为memmove对于重复的情况用倒着复制的方法。

大端和小端:大端是数据低位存于高地址而小段是低位存于低地址,假设地址从左到右由高到低,那么32位下小端一个整形1就是00000001,大端为01000000,那么将这个整形指针强转为char类型,这时在解引用这个char*,此时编译器以处理char类型的方式来处理int类型的指针,就是说读取一个字节解引用,如果是小端就会得到1,因为最小的位存在低地址中,否则就是大端。

结构体大小的计算:

1:结构体的大小必须是最大元素大小的整数倍,数组按照每个单元大小计算。

2:结构体中的元素只能放在本身元素的整数倍的地方。

3:如果嵌套了结构体,则这个嵌套的结构体放在自己最大元素大小的整数倍上。

malloc开辟空间不初始化,calloc开辟空间并初始化为零,realloc重新对一个已有的内存开辟更大的空间,如果足够延长则延长原空间,如果不够,则去开一个新的拷贝数据,并释放旧空间。

预处理:

 

标签:类型转换,复习,int,C语言,问题,cast,内存,变量,指针
From: https://www.cnblogs.com/qjwxlj/p/17419241.html

相关文章

  • C语言编程—存储知识
    存储类定义C程序中变量/函数的的存储位置、生命周期和作用域。这些说明符放置在它们所修饰的类型之前。下面列出C程序中可用的存储类:autoregisterstaticexternauto存储类auto存储类是所有局部变量默认的存储类。定义在函数中的变量默认为auto存储类,这意味着它们在函数开始......
  • maven静态资源配置文件问题
    由于src-main-java里面的文件默认只加载.java类型的文件,如果需要将xml文件或者其他文件放到java文件夹中需要在pom文件中进行配置1<resources>2<resource>3<directory>src/main/java</directory>4<includes>......
  • Linux不用Flash解决在线电视直播、PPTV问题(技术向)
     我看了完美Linux在线电视(直播) 之类的文章 我自己谈谈有什么办法在ubuntu下完美看电视直播,PPTV视频播放这类问题。  其实只要你安装了Flash插件应该可以在网页上完整播放几乎所有的视频了。 至少我见过很多视频站都是用FLash 这里讨论一些有技术的。就是我不用Flas......
  • []复习]cityengine2019/2022导入shp数据生成福田区建筑群
    时间是一把杀猪刀和人工智能比起来我太弱了.很无助.无法给自己升级系统.cityengine2019目前载入那种地区线上数据是行不通了,2022可以整一个邮箱试用一个月.https://www.esri.com/zh-cn/arcgis/products/arcgis-cityengine/trial/professionals我整了一个万能无线邮箱,无法注册,......
  • C语言--位运算
    位运算符只能用于整数类型左移和右移运算符的右操作数范围必须为【0,31】位运算没有短路原则(!取反),所有操作数均会求值位运算的效率高于四则运算和逻辑运算运算优先级:四则运算》位运算》逻辑运算......
  • C语言--单引号和双引号
    单引号用来表示字符字面量,被编译为对应的ASCII码,括起来的当个字符代表整数双引号用来表示字符串字面量,被编译为对应的内存地址,括起来的字符串代表字符指针'a'表示字符字面量--1个字节"a"表示字符串字面量--2个字节 内存的低地址空间不能在程序中随意访问......
  • C语言--接续符
    编译器会将反斜杠剔除,跟在反斜杠后面字符自动接续到前一行在接续单词时,反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格接续符适合在定义宏代码块时使用\n回车换行\t横向跳到下一制表位置\v竖向跳格\b退格\r回车\f走纸换页\\反斜杠符“\”......
  • 锁机制和信号量机制实现水果问题,同步机制
    使用Semaphore类实现packagecom.huo.HelperClass.demo;importsun.security.krb5.internal.TGSRep;importjava.util.concurrent.Semaphore;/***@version1.0*@Author作者名*@Date2022/9/1311:26*///使用Semaphore实现水果同步问题publicclassFruitDem......
  • 左程云动态规划问题学习(python版本重写)
    哔哩哔哩:6.二次优化(3)_哔哩哔哩_bilibili第一个版本对动态规划的理解#问题有大量的重复问题,比如求feibolaqie(5)=feibolaqie(4)+feibolaqie(3),#所以有重复问题,通过缓存优化,把以前求过的问题做缓存#deffeibolaqie(n):#ifn==1:#return1#eli......
  • c语言
    C语言是一种高级程序设计语言,由贝尔实验室的DennisRitchie在20世纪70年代初开发而成。它是一种通用性强、效率高、功能丰富的编程语言,被广泛应用于计算机科学和软件工程领域。C语言的特点之一是它具有较高的可移植性。这意味着开发人员可以在不同的操作系统和硬件平台上编写相同的......