C语言学习笔记

1.数组型字符串和指针型字符串的区别;

    数组型字符串,形如char *ch[20] ="i love u",m会被看成一个地址常量,且就代表&m[0],可以用m+1来表示下一个元素,但是不能用自增运算符,因为自增运算符只能用在变量上面,m[20]在内存(具体在那个地方有待研究)中被分配一个具有20个元素的数组,其中每一个元素对应一个字符,其中包括一个对应结束的空字符'\0'。通常被引用的字符串储存在可执行文件的数据段部分,当程序被加载到内存中时,字符串也被加载到内存中,把被引用的字符串复制到数组中。

    指针型字符串,形如char *ch ="i love u",会在静态存储区为为字符串预留空间,一旦程序开始运行,还要为指针变量m另外预留一个存储位置,用来存储字符串的地址。m++可以指向第二个字符。

2. sizeof和strlen的区别,

    strlen的局限性很大,我感觉只能用来求字符串,从名字就能看出嘛(字符串长度),但是sizeof不一样,(一个东西的长度),这个东西可能是数组啊,可能是指针啊,可能是一个变量类型,可以说用途是非常的广泛了。

    strlen他的本意是去找NULL,找到NULL就停止,这期间走过多少长度就返回,但是不包含这个null的长度,

    sizeof的的本意是:获得保证能容纳实现所建立的最大对象的字节大小;(有点绕,好好想一想),所以这个就跟你放进去的参数是什么有关啦,你放个指针,那不就是一个地址洛,32位系统嘛地址是四字节,64位系统嘛,地址是8字节,你要是放个数组,就看你这个数组声明的是多少个元素的洛,char a[10],就放十个char洛,一个char是一个字节,十个自己算一算嘛。int a[2],不就放两个int洛,一个int四个字节;甚至你参数是函数,sizeof就是函数的返回值类型所占空间的大小。


3.指针常量和常量指针的理解(来自于可爱的女朋友)

    int const *P ;这个是常量指针,可以改变p所指向的地址(P = &a ..之类),但是不能 *p = 8 之类;

    int * const P;这个是指针常量,只能给P赋值一次,之后不能改变其值(p = &a ..之类),但是可以*p = 8 之类;

总结:不希望这个指针所指向的地址变的时候const 放在*左边(常量指针)不希望通过指针改变指向的地址的值的时候  const放在*右边(指针常量)

4.int类型的变量如果溢出了,就会从起始点开始(-2147483648),如果是 unsigned int,就是从0开始啦。

5.在C中,技术上实现char类型其实是整型存储的,比如说char ch = 'A';其实二进制就是0100011,也就是十进制的65,在ASCII码中,65就代表字符A,所以用%d输出ch就是65,用%c输出就是A;

6.关于float和double的在内存中的存储方式

    float是占32个bit,double占64个bit,以float为例,他在内存中的存储方式是,1个符号位,8个指数为,23个尾数位。指数决定了float能表示的范围,尾数为决定了float的精度(2^23 =8388608,也就是说最多能表示7位,能保证6位有效数字),9.25用二进制表示就是1001.01,然后加上科学计数法就是1.00101*2^3,在存储时,我们不用管小数点前面的那个1,只用存小数点后哦面的00101,指数部分存储采用的是移位存储,存储数据为元数据+127,3+127=130,于是现在在内存中,float 9.25 为 0 10000010 00101000000000000000000000000000 ;


你可能感兴趣的:(C语言学习笔记)