学习笔记_004

来源:互联网 发布:小米无人机淘宝加价 编辑:程序博客网 时间:2024/05/19 17:52
  • 在程序中定义一个函数,编译时,编译系统会为函数分配一段存储空间,这段存储空间的起始地址称为这个函数的指针。

    定义指向函数的指针变量 :
    数据类型 (*指针变量名)(函数参数列表);
    如 int (*p)(int,int);

  • 指向函数的指针变量的一个重要用途是把函数的地址作为参数传递到其他函数

  • 无论指针指向什么类型的量,对32位系统来说,都占据4个字节。指针的值是某个内存的地址,这应当是个“整数”。但是,简单地把整数赋给指针是不允许的。如果实在有必要对某个内存地址进行访问,可以通过强制类型转化来完成
    如:int* pNum=(int *)0x0012FF7C

  • void *指针是一种特殊的指针,不指向任何类型的数据,如果需要用此地址指向某类型的数据,应先对地址进行类型转换。指针变量可以有空值,即该指针变量不指向任何变量。

如果没有释放内存,但记录该块内存的指针消亡了或者是指针的值发生了改变,这块内存将得不到回收,造成内存泄漏,如果程序长时间运行,不断的泄漏可能使得系统内存耗尽而崩溃

  • 通过指针可以间接访问其指向的内存区域,此时要用到 * 操作符,在指针声明时也要用到 * 操作符,但两个场合下其作用不同,要注意区分。

在各种编程语言中,字符串的地位都十分重要,C语言中并没有提供“字符串”这个特定类型,而是以特殊字符数组的形式来存储和处理字符串,这种字符数组必须以空字符’\0’结尾,也将这种特定字符数组称为C风格字符串

字符指针变量和字符数组区别

(1) 存放内容不同
字符指针变量中存放的是字符串首地址
字符数组存放的是若干个数组元素
(2)初始化方式不同
字符指针初始化:
char *s=“Hello”;
char *s ; s=“Hello”;
字符数组初始化:static char m[10]=“Hello”;
(3)赋值方式不同
字符数组(或字符串)之间不能进行赋值运算
字符指针无此限制
char *s1=“Hello”, *s2; s2=s1;


  • 结构体是一种构造数据类型
    用途:把不同类型的数据组合成一个整体
    结构体如果定义在函数外,从定义处到本文件结束,结构体都可见。但如果定义在特定函数中,只有在该函数中结构体可见。

C语言不允许使用一个数组直接为另一个数组赋值,但使用一个结构体变量为另一个结构体变量赋值是合法的,可以使用赋值操作符(=)将一个结构变量B赋值给另一个结构变量A,这样,结构变量A中的每个成员都将被设置成结构变量B中相应成员的值,即使成员是数组类型也不例外


  • 联合体
    用途:使几个不同类型的变量共占用一段内存(相互覆盖)
    共用体变量在任何时刻只有一个成员存在
    共用体变量长度等于最长成员所占字节数

union 共用体名称
{
存储数据列表(或称成员变量列表)
};

  • 注意,结束花括号后的分号不要遗漏

  • 枚举类型
    枚举类型是用户自定义的类型,在定义枚举类型时,需指明其取值集合,用枚举类型声明枚举变量时,只能取集合中的某项作为其值,这在一定程度上保证了取值的安全性

  • 结构体相当于是对成员类型打包,而共用体在某个时刻只有一个成员有意义,枚举类型限定了变量的取值范围,在某些场合有独特的应用。
  • 对结构体和共用体来说,通过数据成员访问符“.”可有效访问变量的成员。

UTF-8

it’s 知乎日报
unicode字符集编码表:

I 0049 t 0074 ‘ 0027 s 0073 0020 知 77e5 乎 4e4e 日 65e5 报 62a5

每一个字符对应一个十六进制数
计算机只懂二进制,严格按照unicode的方式(UCS-2),应该这样存储:

I 00000000 01001001 t 00000000 01110100 ‘ 00000000 00100111 s 00000000 01110011 00000000 00100000 知 01110111 11100101 乎 01001110 01001110 日 01100101 11100101 报 01100010 10100101

这个字符串总共占用了18个字节
对比中英文的二进制码,可以发现,英文前9位都是0!浪费啊!
怎么办?
UTF-8是这样做的:

  1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同

  2. n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足

这样就形成了UTF-8标记位:
0xxxxxxx
110xxxxx 10xxxxxx
1110xxxx 10xxxxxx 10xxxxxx
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
… …

It’s 知乎日报就变成了:

I 01001001 t 01110100 ‘ 00100111 s 01110011 00100000 知 11100111 10011111 10100101 乎 11100100 10111001 10001110 日 11100110 10010111 10100101 报 11100110 10001010 10100101

和上面的方案对比,英文短了,每个中文字符却多了一个字节。但是整个字符串只用了17个字节,比上面的18个短了一点
————————以上部分参考于知乎问答—————————–