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、函数指针和指针函数
       传递一种行为给子函数,即传递一个函数给子函数。传递一个函数指针(即地址)给子函数。
       指针函数就是返回值就是指针的函数。
       函数指针又叫回调函数,或钩子函数。
       接口就会用到函数指针的。
原创粉丝点击