C语言基础笔记2
来源:互联网 发布:android登陆界面源码 编辑:程序博客网 时间:2024/06/06 07:13
1、逻辑运算符: 短路运算(eg: a||printf("error")) 可以少写一个if,或者导出异常。2、位运算操作符: 高效利用内存,用每一位去代表是实际的意义,按位异或^,
非0数与0异或= 本身 1234^0=1234 1234^1234= 0 本身异或
3、左右移:<< >> 左移用来申请内存 eg:1<<10 就是1024 左移乘2,正数右移除
2(若为奇数,则会丢掉最后一位,在除2,相当于
减1,除2)(若为负数,则符号位不动,次
高位补1)
4、使用条件运算符,求其最大值。
5、任何表达式都是有值的,其逗号运算符的值是其最后的那个表达式的值。
牛客网、或leetcode
6、goto实现循环加法
往下跳的目的往往是程序
出错。只能在本函数使用
7、构造就是初始化。const 是左结合的。
8、strcpy是用于字符数组的copy。而memcpy是用于非字
符串的,如整型、浮点数组、或结构体等。
9、不能把变量定义到头文件里。
//排序算法就是要控制好它的边界 排序:内层控制边界。
10、冒泡排序
//a[]是待排序数组
for(int i=n-1; i>0; i--) //用来控制比较的次数
{
for(int j=0; j<i ;j ++)
{
if(a[j]>a[j+1])
SWAP(); //可以写成宏定义
}
}
11、简单选择排序
总共进行n次操作,每次操作选出待排序部分[i,n]间的最
小值,让最小值和无序的集合A[i]进行交换即可。
voidarr_select(int*a)
{
inti,j,min_pos;
for(i = 0; i <N-1; i++)
{
min_pos = i;
//此次循环目的是找到最小值的序号位置
for(j=i+1 ; j <N; j++)
{
if(a[min_pos]>a[j])
{
min_pos = j; //记下最小值的位置
}
}
SWAP(a[i],a[min_pos]);
}
}
12、插入排序
13、strcpy函数,
#include <string.h>
char *strcpy( char *to, const char *from );
功能:复制字符串from中的字符到字符串to,包括空值结束符。返回值为指针to。
14、一个字符就是一个字节。
15、对于字符串来说,sizeof()会返回\0 是以文本来说的,strlen() 返回不会返回\0,和其他什么别的字符
eg: char a[5]="test" 它会自动在字符串后面加上\0
sizeof(a) 是 5 (因为加上了\0) 而strlen(a) 是4 。
16、基本型 int 4字节 -231~231-1
短整型 short 2字节 -215~215-1
长整型 long 4字节
char 1字节
浮点型,关心的是精度, float 6-7位 4字节
double 15-16位 8字节
long double 17-18位 16字节
逗号表达式,是最后一个表达式的值
17、
//一维数组的传递,长度是无法传递过去的
可以写成void print(intp[],intn)
18、
//若不是,数组下标,循环变量不一定要从0开始
19、如果不是排序(比如找最大值,和次大值),就不要暴力排序
20、gets函数获得字符串,他会自动的附上 '\0' 是以换行\n 或者EOF结束的 错误返回NULL
21、指针的使用环境:
传递:c语言函数调用是值传递 偏移:
22、二维数组的数组名不是单指针,而是一个一级的数组指针。
一维数组的数组名取地址,就是一个数组指针。
二维数组是用一级的数组指针来实现的,而不是二级指针。特别注意。
任何指针的偏移都基于它的基类形。
23、注意:字符数组赋值和字符指针的赋值的不同,注意,若是字符指针在二次赋值时,可以打印,但是常量区
是不可修改的,但可以指向其他的字符串。而字符数组的实际的栈空间是可以修改的。
24、任何类型的取地址再加1,都偏移到了,该类型的结尾处,即新的类型的开头。
25、堆空间就是动态分配,你需要多少就是多少,而栈空间,则起空间是事先定义好了的。
26、void * 是不能做偏移的。
27、在将free( )后,,要将指针p置为 NULL ,我们把已经free,没有把p置为NULL的指针称位野指针。
28、不能在子函数里面返回栈空间的地址值。若果,非要在子函数中弄一块空间去返回使用,我们就应该使用堆
空间,因为堆空间它不会因为子函数结束而释放,它会较长的存在,只有你自己去释放,它才会释放。
29、所以,在使用中堆空间进行动态分配的时候,要记得释放空间free(p),,并且将该指针置为NULL,并且该指
针不能偏移。
30、进程虚拟地址空间:操作系统将虚拟地址空间与实际物理内存地址空间相对应。
在Linux里面的内存管理单元是MMU,用索引。
31、二级指针使用场景也只有,传递和偏移。 但是它的服务对象就只有一级指针。
32、传递使用场景一:当我们需要在子函数里面改变主函数的一级指针变量的值时候,就必须使用二级指针,由于值传递机制,在c语言中就必须将其地址传递进去,才能改变它。
33、二级指针的偏移也只服务于一级指针,它与指针数组相对应。
34、把逻辑存下来会变得更加简单些。
35、char *p;
p=(char *)malloc(20);
如果p="hello", //p就发生了偏移,而在堆空间的申请内存的指针就不能释放了,找不到,就会发生内存
泄露。
36、指针数组的数组名内存储的是一个 二级指针,二级指针如果指向了多个字符串,则每次偏移斗志一个这真的
大小,即4个字节。
37、实际上,++操作符的运行都是下一条语句才进行的。eg: j=*p++ 分解后就是 j=*p; p=p+1
j=(*p)++ 分解后就是j=(*p); *p=*p+1;
38、在不同函数里面的跳转我们要通过一个接口,setjmp 可以理解成函数跳转。
用一个jmp_buff 比如:定义一个envbuf,的变量保存函数状态,,在底层函数中使用
longjmp(envbuf,5) 即可,其中5是可以变化的。
39、在什么情况下,需要在主函数里面定义二级指针。(注意)
动态的指针数组,将一级指针强转化为二级指针,的需求是要用二级指针去存放一级指针的地址。需要解引
用两次。
40、函数指针和指针函数
传递一种行为给子函数,即传递一个函数给子函数。传递一个函数指针(即地址)给子函数。
指针函数就是返回值就是指针的函数。
函数指针又叫回调函数,或钩子函数。
接口就会用到函数指针的。
阅读全文
0 0
- C语言基础笔记2
- C语言基础笔记
- C语言基础笔记
- C语言 基础笔记
- C语言基础笔记
- C语言基础笔记
- C语言基础笔记(2)
- C语言基础学习笔记
- C语言基础概况笔记
- C语言基础笔记1
- C语言基础笔记3
- C语言基础(笔记)
- ios笔记--C语言基础笔记
- c语言基础 2
- c语言基础 (2)
- c语言基础2
- C语言基础2
- 2、C语言基础
- Hadoop平台搭建之Linux实验环境
- java之基本数据类型(笔记)
- 分治法
- java反射
- 20170709训练赛比赛总结
- C语言基础笔记2
- [图论] NKOJ 1952 运输问题
- 华为机试:字符个数统计、提取不重复的整数
- C语言基础笔记3
- 基于linux下的xshell脚本文件入门及例题
- htmlunit介绍
- PHP 命名空间
- 构建 react应用程序 (二)(react-scripts实现原理)
- Microsoft Office Picture Manager打开慢