C语言学习笔记

整型提升:表达式中字符(char)和短整型(short)操作数在使用之前需被转换为普通整形(int)。

算术转换:某个操作符的操作数属于不同类型,需转换为同一类型。

{1 long double

2 double

3 float

4 unsigned long int

5 long int

6 unsigned int

7 int  }  下层的需转换为上层的。

指针类型决定了解引用时访问几个字节,也决定了指针加减操作时移动几个字节。

二分查找防溢出:left+((right-left)>>1)

Void*:泛型指针,无具体类型,不可进行解引用和整数加减操作。

在C语言中,const修饰的变量是常变量,不可修改,但可以通过指针解引用来更    改。(封门打破窗)

在C++中,const修饰的变量变为常量。

const修饰指针变量时,放在*右边,限制的是指针变量本身,指针变量不能再指向其他变量,但可以通过指针变量,修改指针变量指向的内容。

const修饰指针变量时,放在*左边,限制的是指针指向的内容,不能通过指针来修改,但是可以修改指针变量本身(实质是修改其指向)。

指针-指针的绝对值是两指针之间的元素个数。

指针-指针必须保证两指针指向同一空间。

野指针:指向位置是随机的。

局部变量未初始化是随机值,全局变量未初始化默认为0

尽量不返回局部变量的地址,避免野指针。

assert(表达式):断言,表达式为真,继续运行,表达式为假,报错并终止运行,z知名在哪个文件,哪一行。使用时包含头文件<assert.h>。

如果不需要做断言,只需在头文件前加#define NDEBUG,编译器就会屏蔽到所有assert。

arr[i]<==>*(arr+i)<==>*(i+arr)<==>i[arr]

数组传参时,形参部分可以写成数组形式,但本质上还是指针变量。数组传参本质是传递数组首元素地址,形参和实参数组是同一个数组.形参不会再开辟数组空间,所以形参数组可以不写数组大小。

Char* p=”abcdef”  p存放的是常量字符串首元素的地址。但常量字符串不可被修改,因为它被存放在代码段里,代码段里的数据不可被修改。相当于const int* p。

打印字符串:printf(“%s”,p); p是字符串的首元素地址。

strcmp(str1,str2):若str1>str2(abd与abc  abcd与abc),返回整数,str1==str2,返回0,str1<str2,返回负数。

strstr(str1,str2):查找str1里是否存在str2,存在,返回str1中与str2相同字符串的首元素地址,不存在返回NULL。

Int (*p)[10]:数组指针,p是一个指针变量,指向一个是个整形元素的数组。[]的结合性大于*,所以要给*p加括号,保证它是一个指针变量。[]中的数字不可省略。

*(*(arr+i)+j)<==>arr[i][j]

函数名与&函数名都是函数地址,意义相同。

函数指针写法:int(返回值类型)(*pf)(int(参数类型),int(参数类型))

Typedef:类型重定义,给一类型重新取一个名字。例:typedef int xyz;  特殊的,对函数指针类型与数组指针类型重定义:typedef int(*pf_t)[5]  此时pf_t就是 int(*)[5]

把函数指针/数组指针中的变量名去掉,就是对应的类型。

函数指针数组格式:int( *p[10])(int, int),只需在函数指针的变量名后加上[]

qsort:库函数,用来排序数据,可以排序任意类型的数据,底层是快速排序。

结构体指针写法:struct stu *p  其中stu是自定义的结构体名,必须带着。

void qsort(void* base//指针,指向待排序数组的第一个元素

             size_t num//base指向的待排序数组的元素个数

             size_t size//base指向的待排序数组的元素大小

             Int (*compar)(const void*, const void*)//函数指针,指向的就是两个元素的比较函数(需自己编写)

二维数组可以看成是一维数组,每个元素是一个一维数组。

arr[i][j]-->arr[i]可以看作是第i行的数组名。  而arr是整个二维数组的数组名。

字符串函数:1、strcpy(*p1,*p2)-->p2指向的字符串复制给p1.(\0也会一起复制)  此时p1不能指向常量字符串。2、strlen()-->  size_t strlen(const char*)   所以strlen的参数必须是指针.,且返回值是无符号整数。3、 strcat:追加(连接)字符串  strcat(*p1,*p2)->把p2指向的内容连接在p1的后面。

字符分类函数:判断一个字符属于什么类型,若参数符合下列条件就返回真。

使用时包含头文件<ctype.h>

Iscntrl:任何控制字符 isspace:空白字符(换页\f 换行\n 回车\r 制表符\t 垂直制表符\v)

Isdigit;十进制数字’0’~’9’字符

Isxdigit:十六进制数字,包含所有十进制数字,小写字母a~f,大写A~F

Islover:小写字母a~z

Isupper:大写字母A~Z

Isalpha:所有字母

Isalnum:字母或数字

Ispunct:标点符号,任何不属于字母或数字的图形字符

Isgraph:任何图形字符

Isprint:任何可打印字符,包括图形字符和空白字符。

字符转换函数:int tolower( int c)  将大写转为小写  int toupper( int c)  将小写转为大写。

char* strtok(char* str,const char* sep)

Sep指向一个字符串,定义了分隔符的字符集合。Strtok以分隔符为界,从左向右依次取出字符串。例如ahsuvre@163.com 第一次取出ahsuvre,第二次取出163,第三次取出com(每一次取出都会标记一个分隔符的后一位) 第一个参数第一次传字符串首地址,后几次传NULL。

char* strerror(int errnum)

           Strerror函数可以把参数部分的错误码对应的错误信息的字符串地址返回。

           c标准库中规定了一些错误码,一般放在error.h 头文件中。c程序启动的时候会使用一个全局变量errno来记录当前错误码,只不过程序启动时errno为0,当程序发生某种错误时,就会将对应的错误码存放在errno中。

           perror函数是strerror的加强版,直接打印错误信息,先打印传给perror的字符串,然后打印冒号,再打印空格,最后打印错误码对应的错误信息。 perror(某字符串)

各种0:  0-->数字0    ‘0’—>字符0,ASCII为48   NULL—>空指针,指向0地址,   ‘\0’—>ASCII为0,  “”--->空字符串。

char* StrStr(const char* A, const char* B)  在A字符串中查找B字符串,返回B在A中第一次出现的位置的地址,为出现则返回NULL。

Strn{cat、cpy、 cmp} 长度受限字符串函数,参数多一个size_t  num(限制长度)  strncat(arr1,arr2,num) 当arr1长度>arr2时,不够用’\0’补,当arr1<arr2时,不够不用补,正常追加到’\0’.

内存操作函数:(都是以字节为单位操作的)

     1. void* memcpy(void* destination, const void* source, size_t num)   

       函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置,拷贝结束后返回目标数据的首元素地址。   函数在遇到’\0’ 时不会停下来。 如果source和destination有任何的重叠,结果都是未定义的。  使用时包含头文件<string.h>

     2 void* memmove(void* destination, const void* source, size_t num)  

       Memmove函数可以处理内存重叠的情况,其他和memcpy一致。

     3 void* memset(void* ptr,int value, size_t num)

       把ptr指向空间中num个字节的数据全部改为value,  注意:memset是以字节为单位设置的,不是以元素为单位的。 在对整形数据操作时需注意 (00 00 00 00)—>四字节

     4 int memcmp(const void* p1, const void p2, size_t num)

        比较从p1和p2指针指向的位置开始,比较num个字节的数据. 返回整数。

内存从左到右依次增大,低位存在高地址中为大端法,反之为小端法。

Char 是否有符号取决于编译器,vs上char是有符号的

给char类型复制一个数,最终也会根据ASCII转化为对应的字符

1E10==1.0*10^10

IEEE754:任意浮点数都可以表示为V=(-1)^S*M*2^E

(-1)^S表示符号位,S>0,为正,S<0,为负。 M为有效数字,大于等于1,小于等于2   E为指数位。

浮点数在计算机里存储的是S,M,E

          对于32位浮点数(float),最高位的一位存S,接着8位存E,剩下的23位存M      对于64位浮点数(double)最高为一位存S,接着11位存E,剩下的52位存M

          在计算机内部保存M时,默认第一位总是1,因此可以被舍去,以此节省一位有效数字。

          对于E,计算机将其视为无符号整数,在存入E的真实值时必须加上一个中间数,8位的E加上127,11位的E加上1023。

          浮点数取出时,分三种情况:

  1. E不全为0或1,E减去127或1023,得到真实值,M补回最高位的1.
  2. E全为0:此时E的真实值规定为1-127或1-1023,M不再补回首位的1,而是还原为0.xxxxxxxxx的小数,以此表示正负0或无限趋近于0的数字。
  3. E全为1:此时如果M全为0,就表示正负无穷。
  1. 匿名结构体类型:去掉结构体的标签,且此结构体类型只能用一次。

     

80、结构体自引用:在结构体中定义一个和自身结构体类型一样的变量(如链表的定义)  匿名结构体是不能完成结构体自引用的。

  • 19
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值