资讯专栏INFORMATION COLUMN

21_09_25 C语言杂谈

JerryZou / 1229人阅读

摘要:多维数组本质上和一维数组没区别,他的维数仅仅只是作为比例因子和偏移,拿来计算地址偏移用的,但是多级指针用数组访问的时候,他的维数仅仅只做偏移用,他的过程是加偏移,解引用,加偏移,解引用。。。。

类型

c语言中规定类型这样一个事情,主要是出于一个怎样的原因呢?

char        short        int        long        long longfloatdouble

常规主要的类型,就是上面的几种类型

char          类型常用于存储字符数据,数据宽度为8bit,唉?一个英文字符也是八个bit位就能存下,好像他这个设计很合理啊,但是呢,其实我们深究一下,他是不合理的,为啥呢,主要从两方面来说明问题,在32位的pc机前提下讨论。

1.你使用char类型在进行参数传递的时候,它实际还是按4字节传递的,最主要的原因是为了适应本机宽度的问题

2.对齐问题,我们所讨论的对齐,都是要基于硬件的,硬件不支持的话一切都是扯,那么char类型的对齐方式是按1字节对齐的,好像计算机也是最小访问一字节哈,但是问题就出在这里,cpu的最小对齐单位是word,也就是双字,那就意味着,一字节的对齐方式,只是cpu为我们做了适当的处理

当然,要出也是有的,就旦旦只是节省内存,经此而已。

float 也会默认转成 double 主要原因,一个是精度,一个是本机宽度

其他的几个类型,就不再赘述了,相信你已经悟到了!

符号问题

c语言中有有符号无符号的这种说法,好像对于我们的认知来说数确实是有正负的问题哈,很合理哈,但是问题就出在这里了,计算机怎么知道你是有符号还是无符号??计算机做加减法都仅仅只是做与或非操作而已,它并不能判断你的数究竟有无符号,0xFFFFFFFF你能说他是正数还是负数??0xFFFFFFFF 与0x12345678你能直接说他谁大谁小??这都是无法确定的,因为我无法确定你是把高位当符号位看还是不当符号位看,同样计算机也是无法确定,那么在cpu的角度来说,0xFFFFFFFF - 0x12345678究竟结果是正是负?无法确定,所以cpu把他即当无符号数也当有符号数,按无符号数的运算结果设置CF位,按有符号数的结果设置OF位,这下应该清楚为啥会有符号的说法了吧,其目的就是要让编译器能够准确无误的选择是使用根据OF位的进行操作的汇编指令,还是选择是使用根据CF位的进行操作的汇编指令,总结,c语言的符号设计是让程序员显示指导,消除歧义。

类型强转

他这个设计又是为了什么呢??说白了就是为了确定两个事情,一个就是转换数据宽度,一个就是转换步长,转换数据宽度就不再赘述了,转换步长

int *A;int *B;int *C;

现在又三个指针变量,那么他们现在的步长都是4个字节,现在我想让他每次的步长是两个字节,那么可以把他转换成 short* 类型,或者转换从(char (*)[2])类型,都是可以的,这个就是强转的意义

数组和指针

char * szp = “ABCDEF”;char szArr[] = "Hello World";

好像他俩没啥区别嚯,

char * szp = “ABCDEF”;char szArr[] = "Hello World";//好像指针也可以通过数组的形式访问szp[i];//好像数组也可以通过指针的形式访问*(szArr + i);

这事怕也也干的多了,好像也没啥问题,多级指针和多维数组好像也没有问题哈,确实一维数组和一级指针在这样的两种访问方式下确实是等价的,但是问题就出现在了多维数组和多级指针上

int***p;//用数组访问p[i][j][k];----------------------int Arr[i][j][k];//用指针的形式访问*(*(*(Arr + m) +n) + v);

好像是我们平时这么使用是没啥问题哈,但是其实是他的本质已经发生变化了,事先说明一下。多维数组本质上和一维数组没区别,他的维数仅仅只是作为比例因子和偏移,拿来计算地址偏移用的,但是多级指针用数组访问的时候,他的维数仅仅只做偏移用,他的过程是加偏移,解引用,加偏移,解引用。。。。而数组以指针方式访问的时候,他的本质其实还是比例因子加偏移,他的 * 取值操作符,压根就没有取值,仅仅只是给你看看,让你比如那么慌,让你更好理解你所访问的值是哪个,仅此而已。

本人水平有限,有错的地方希望各位大佬指正;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121135.html

相关文章

  • Python在什么时候会生成pyc文件呢?

    Python在什么时候会生成pyc文件呢?   事情大概是这样的,之前我一直以为python文件在执行过之后就会生成pyc文件,后来一次偶然情况下,发现还是自己too young too simple,在看过其他大神文章并且自己验证之后,发现还是有点意思的,权当没事写点文章吧。 什么是pyc文件呢?   简单来说,pyc文件就是Python的字节码文件,我们都知道Python是一种全平台的解释性语...

    MobService 评论0 收藏0
  • 第一个springboot程序(基于IDEA)

    摘要:启动项目,验证进入到项目中的中的方法的类中,在方法上点击启动启动报错,查看报错原因分析问题原因说明端口被占用了。解决方法修改的端口号,或者将端口的应用的端口号修改了。再次启动项目启动成功,验证项目,验证成功 1.创建项目 打开IDEA,File->New->ProjectshowImg(https://segmentfault.com/img/bV22nr?w=523&h=225); ...

    microcosm1994 评论0 收藏0
  • 搭建Spark集群?没想到你是这样的k8s

    摘要:在本文的例子中,你将使用和创建一个功能型集群。第二步启动你的服务是集群的服务。这可能需要一些时间来拉取镜像并启动。注将含有到的超链接。这些链接是不能正常工作的链接将尝试连接到集群,而不会自动代理的集群。快速使用使用连接到驱动并运行。 在本文的例子中,你将使用 Kubernetes 和 Docker 创建一个功能型Apache Spark集群。 你将使用Spark standalone模...

    bitkylin 评论0 收藏0
  • Android Studio 通过一个登录功能介绍SQLite数据库的使用

    摘要:前言简介是一款轻型的数据库,是遵守的关系型数据库管理系统,它包含在一个相对小的库中。第一个版本诞生于年月。数据库,它广泛用于包括浏览器,以及一些便携需求的小型应用系统。接下来,我会通过一个登录功能来介绍一下数据库在实际项目中的使用。前言: SQLite简介:是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领...

    番茄西红柿 评论0 收藏0
  • 利用hadoop mapreduce 做数据排序

    摘要:由于在之后就不能对结果做什么了,所以只能分为两个完成,第一个统计次数,第二个对第一个的结果排序。第一个的就是最简单的例子,我要说的是用对结果排序。 由于Hadoop在reduce之后就不能对结果做什么了,所以只能分为两个job完成,第一个job统计次数,第二个job对第一个job的结果排序。 第一个job的就是hadoop最简单的例子countwords,我要说的是用hadoop对结果排序...

    Kosmos 评论0 收藏0

发表评论

0条评论

JerryZou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<