c语言|21_09_25 C语言杂谈
类型
c语言中规定类型这样一个事情,主要是出于一个怎样的原因呢?
charshortint longlong 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);
好像是我们平时这么使用是没啥问题哈,但是其实是他的本质已经发生变化了,事先说明一下。多维数组本质上和一维数组没区别,他的维数仅仅只是作为比例因子和偏移,拿来计算地址偏移用的,但是多级指针用数组访问的时候,他的维数仅仅只做偏移用,他的过程是加偏移,解引用,加偏移,解引用。。。。而数组以指针方式访问的时候,他的本质其实还是比例因子加偏移,他的 * 取值操作符,压根就没有取值,仅仅只是给你看看,让你比如那么慌,让你更好理解你所访问的值是哪个,仅此而已。
本人水平有限,有错的地方希望各位大佬指正;
【c语言|21_09_25 C语言杂谈】
推荐阅读
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- C语言解方程的根和判断是否是闰年
- C语言的版本比较
- 【C】题目|【C语言】题集 of ⑥
- echart|echart 双轴图开发