C语言基础笔记2
1、邏輯運算符: ? ? ?短路運算(eg: ?a||printf("error")) ? ?可以少寫一個if,或者導(dǎo)出異常。2、位運算操作符: ? 高效利用內(nèi)存,用每一位去代表是實際的意義,按位異或^,
? ? ? ? ? ? ? ? ? ? ? ? ?非0數(shù)與0異或= ?本身 ?1234^0=1234 ? ? ? ? ? ? 1234^1234= ? 0 ? ? 本身異或
3、左右移:<< ? ?>> ? ?左移用來申請內(nèi)存 ? ?eg:1<<10 ?就是1024 ? ? 左移乘2,正數(shù)右移除 ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 2(若為奇數(shù),則會丟掉最后一位,在除2,相當(dāng)于
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 減1,除2)(若為負數(shù),則符號位不動,次 ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? 高位補1)
4、使用條件運算符,求其最大值。
5、任何表達式都是有值的,其逗號運算符的值是其最后的那個表達式的值。
? ? ? 牛客網(wǎng)、或leetcode
6、goto實現(xiàn)循環(huán)加法
? ? ?往下跳的目的往往是程序 ? ??
? ? ?出錯。只能在本函數(shù)使用
7、構(gòu)造就是初始化。const 是左結(jié)合的。
8、strcpy是用于字符數(shù)組的copy。而memcpy是用于非字 ? ?
?????符串的,如整型、浮點數(shù)組、或結(jié)構(gòu)體等。
9、不能把變量定義到頭文件里。
//排序算法就是要控制好它的邊界 ? ? ? ? ? ?排序:內(nèi)層控制邊界。
10、冒泡排序
? ? ?//a[]是待排序數(shù)組
? ? ?for(int i=n-1; i>0; i--) ? ?//用來控制比較的次數(shù)
? ? ?{
? ? ? ? ? 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; ??????????????//此次循環(huán)目的是找到最小值的序號位置 ??????????????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函數(shù), ? ? ? #include <string.h> ? char *strcpy( char *to, const char *from );
功能:復(fù)制字符串from中的字符到字符串to,包括空值結(jié)束符。返回值為指針to。
14、一個字符就是一個字節(jié)。 15、對于字符串來說,sizeof()會返回\0 ? 是以文本來說的,strlen() ?返回不會返回\0,和其他什么別的字符 ? ? ? ? ? eg: char a[5]="test" ?它會自動在字符串后面加上\0 ? ? ? ? ? ? ? ?sizeof(a) ?是 5 (因為加上了\0) ?而strlen(a) 是4 。 16、基本型? ? ? ?int? ? ? ? ? ? 4字節(jié)? -231~231-1 ? ? ? ? ?短整型? ? ? ?short? ? ? ? ? 2字節(jié)? -215~215-1 ? ? ? ?? 長整型? ? ? ?long? ? ? ? ? ?4字節(jié) ? ? ? ? ? ? ? ? ? ? ? ? char ? ? ? ? ? 1字節(jié) 浮點型,關(guān)心的是精度, ?float ? ? 6-7位 ? ? ? ? ? ? ? ?4字節(jié) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?double ? ?15-16位 ? ? ? ? ?8字節(jié) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? long double ?17-18位 ? ?16字節(jié)
逗號表達式,是最后一個表達式的值 17、 //一維數(shù)組的傳遞,長度是無法傳遞過去的 ? 可以寫成void?print(intp[],intn) 18、 //若不是,數(shù)組下標,循環(huán)變量不一定要從0開始 19、如果不是排序(比如找最大值,和次大值),就不要暴力排序 20、gets函數(shù)獲得字符串,他會自動的附上 ?'\0' ? 是以換行\(zhòng)n 或者EOF結(jié)束的 ?錯誤返回NULL 21、指針的使用環(huán)境: ? ? ?傳遞:c語言函數(shù)調(diào)用是值傳遞? ? ? ? 偏移:
22、二維數(shù)組的數(shù)組名不是單指針,而是一個一級的數(shù)組指針。 ? 一維數(shù)組的數(shù)組名取地址,就是一個數(shù)組指針。 ? ? ? ? ? 二維數(shù)組是用一級的數(shù)組指針來實現(xiàn)的,而不是二級指針。特別注意。 ? ? ? ? ? 任何指針的偏移都基于它的基類形。 23、注意:字符數(shù)組賦值和字符指針的賦值的不同,注意,若是字符指針在二次賦值時,可以打印,但是常量區(qū) ? ? ?? 是不可修改的,但可以指向其他的字符串。而字符數(shù)組的實際的??臻g是可以修改的。 24、任何類型的取地址再加1,都偏移到了,該類型的結(jié)尾處,即新的類型的開頭。 25、堆空間就是動態(tài)分配,你需要多少就是多少,而??臻g,則起空間是事先定義好了的。 26、void * ?是不能做偏移的。 27、在將free( )后,,要將指針p置為 ?NULL ?,我們把已經(jīng)free,沒有把p置為NULL的指針稱位野指針。 28、不能在子函數(shù)里面返回棧空間的地址值。若果,非要在子函數(shù)中弄一塊空間去返回使用,我們就應(yīng)該使用堆 ? ? ? ? 空間,因為堆空間它不會因為子函數(shù)結(jié)束而釋放,它會較長的存在,只有你自己去釋放,它才會釋放。 29、所以,在使用中堆空間進行動態(tài)分配的時候,要記得釋放空間free(p),,并且將該指針置為NULL,并且該指 ? ? ?? 針不能偏移。 30、進程虛擬地址空間:操作系統(tǒng)將虛擬地址空間與實際物理內(nèi)存地址空間相對應(yīng)。 ? ? ?? 在Linux里面的內(nèi)存管理單元是MMU,用索引。 31、二級指針使用場景也只有,傳遞和偏移。 ? ?但是它的服務(wù)對象就只有一級指針。 32、傳遞使用場景一:當(dāng)我們需要在子函數(shù)里面改變主函數(shù)的一級指針變量的值時候,就必須使用二級指針,由于值傳遞機制,在c語言中就必須將其地址傳遞進去,才能改變它。 33、二級指針的偏移也只服務(wù)于一級指針,它與指針數(shù)組相對應(yīng)。 34、把邏輯存下來會變得更加簡單些。 35、char *p; ? ? ? ?p=(char *)malloc(20); ? ? ? ? 如果p="hello", ?//p就發(fā)生了偏移,而在堆空間的申請內(nèi)存的指針就不能釋放了,找不到,就會發(fā)生內(nèi)存 ? ? ? ? 泄露。 36、指針數(shù)組的數(shù)組名內(nèi)存儲的是一個 ?二級指針,二級指針如果指向了多個字符串,則每次偏移斗志一個這真的 ? ? ? ?大小,即4個字節(jié)。 37、實際上,++操作符的運行都是下一條語句才進行的。eg: ?j=*p++ ?分解后就是 j=*p; p=p+1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? j=(*p)++ 分解后就是j=(*p); *p=*p+1; 38、在不同函數(shù)里面的跳轉(zhuǎn)我們要通過一個接口,setjmp ?可以理解成函數(shù)跳轉(zhuǎn)。 ? ? ? ? ? 用一個jmp_buff ?比如:定義一個envbuf,的變量保存函數(shù)狀態(tài),,在底層函數(shù)中使用 ? ? ? ?? ? ?? ?????longjmp(envbuf,5) ?即可,其中5是可以變化的。 39、在什么情況下,需要在主函數(shù)里面定義二級指針。(注意) ? ? ? ?動態(tài)的指針數(shù)組,將一級指針強轉(zhuǎn)化為二級指針,的需求是要用二級指針去存放一級指針的地址。需要解引 ? ? ?? 用兩次。
40、函數(shù)指針和指針函數(shù) ? ? ? ?傳遞一種行為給子函數(shù),即傳遞一個函數(shù)給子函數(shù)。傳遞一個函數(shù)指針(即地址)給子函數(shù)。
? ? ? ?指針函數(shù)就是返回值就是指針的函數(shù)。 ? ? ? ?函數(shù)指針又叫回調(diào)函數(shù),或鉤子函數(shù)。 ? ? ? ?接口就會用到函數(shù)指針的。
? ? ? ? ? ? ? ? }
?????}
11、簡單選擇排序 ? ? ?總共進行n次操作,每次操作選出待排序部分[i,n]間的最 ? ? ?????小值,讓最小值和無序的集合A[i]進行交換即可。? ? voidarr_select(int*a) { ???????inti,j,min_pos; ???????for(i = 0; i <N-1; i++) ???????{ ??????????????min_pos = i; ??????????????//此次循環(huán)目的是找到最小值的序號位置 ??????????????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函數(shù), ? ? ? #include <string.h> ? char *strcpy( char *to, const char *from );
功能:復(fù)制字符串from中的字符到字符串to,包括空值結(jié)束符。返回值為指針to。
14、一個字符就是一個字節(jié)。 15、對于字符串來說,sizeof()會返回\0 ? 是以文本來說的,strlen() ?返回不會返回\0,和其他什么別的字符 ? ? ? ? ? eg: char a[5]="test" ?它會自動在字符串后面加上\0 ? ? ? ? ? ? ? ?sizeof(a) ?是 5 (因為加上了\0) ?而strlen(a) 是4 。 16、基本型? ? ? ?int? ? ? ? ? ? 4字節(jié)? -231~231-1 ? ? ? ? ?短整型? ? ? ?short? ? ? ? ? 2字節(jié)? -215~215-1 ? ? ? ?? 長整型? ? ? ?long? ? ? ? ? ?4字節(jié) ? ? ? ? ? ? ? ? ? ? ? ? char ? ? ? ? ? 1字節(jié) 浮點型,關(guān)心的是精度, ?float ? ? 6-7位 ? ? ? ? ? ? ? ?4字節(jié) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?double ? ?15-16位 ? ? ? ? ?8字節(jié) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? long double ?17-18位 ? ?16字節(jié)
逗號表達式,是最后一個表達式的值 17、 //一維數(shù)組的傳遞,長度是無法傳遞過去的 ? 可以寫成void?print(intp[],intn) 18、 //若不是,數(shù)組下標,循環(huán)變量不一定要從0開始 19、如果不是排序(比如找最大值,和次大值),就不要暴力排序 20、gets函數(shù)獲得字符串,他會自動的附上 ?'\0' ? 是以換行\(zhòng)n 或者EOF結(jié)束的 ?錯誤返回NULL 21、指針的使用環(huán)境: ? ? ?傳遞:c語言函數(shù)調(diào)用是值傳遞? ? ? ? 偏移:
22、二維數(shù)組的數(shù)組名不是單指針,而是一個一級的數(shù)組指針。 ? 一維數(shù)組的數(shù)組名取地址,就是一個數(shù)組指針。 ? ? ? ? ? 二維數(shù)組是用一級的數(shù)組指針來實現(xiàn)的,而不是二級指針。特別注意。 ? ? ? ? ? 任何指針的偏移都基于它的基類形。 23、注意:字符數(shù)組賦值和字符指針的賦值的不同,注意,若是字符指針在二次賦值時,可以打印,但是常量區(qū) ? ? ?? 是不可修改的,但可以指向其他的字符串。而字符數(shù)組的實際的??臻g是可以修改的。 24、任何類型的取地址再加1,都偏移到了,該類型的結(jié)尾處,即新的類型的開頭。 25、堆空間就是動態(tài)分配,你需要多少就是多少,而??臻g,則起空間是事先定義好了的。 26、void * ?是不能做偏移的。 27、在將free( )后,,要將指針p置為 ?NULL ?,我們把已經(jīng)free,沒有把p置為NULL的指針稱位野指針。 28、不能在子函數(shù)里面返回棧空間的地址值。若果,非要在子函數(shù)中弄一塊空間去返回使用,我們就應(yīng)該使用堆 ? ? ? ? 空間,因為堆空間它不會因為子函數(shù)結(jié)束而釋放,它會較長的存在,只有你自己去釋放,它才會釋放。 29、所以,在使用中堆空間進行動態(tài)分配的時候,要記得釋放空間free(p),,并且將該指針置為NULL,并且該指 ? ? ?? 針不能偏移。 30、進程虛擬地址空間:操作系統(tǒng)將虛擬地址空間與實際物理內(nèi)存地址空間相對應(yīng)。 ? ? ?? 在Linux里面的內(nèi)存管理單元是MMU,用索引。 31、二級指針使用場景也只有,傳遞和偏移。 ? ?但是它的服務(wù)對象就只有一級指針。 32、傳遞使用場景一:當(dāng)我們需要在子函數(shù)里面改變主函數(shù)的一級指針變量的值時候,就必須使用二級指針,由于值傳遞機制,在c語言中就必須將其地址傳遞進去,才能改變它。 33、二級指針的偏移也只服務(wù)于一級指針,它與指針數(shù)組相對應(yīng)。 34、把邏輯存下來會變得更加簡單些。 35、char *p; ? ? ? ?p=(char *)malloc(20); ? ? ? ? 如果p="hello", ?//p就發(fā)生了偏移,而在堆空間的申請內(nèi)存的指針就不能釋放了,找不到,就會發(fā)生內(nèi)存 ? ? ? ? 泄露。 36、指針數(shù)組的數(shù)組名內(nèi)存儲的是一個 ?二級指針,二級指針如果指向了多個字符串,則每次偏移斗志一個這真的 ? ? ? ?大小,即4個字節(jié)。 37、實際上,++操作符的運行都是下一條語句才進行的。eg: ?j=*p++ ?分解后就是 j=*p; p=p+1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? j=(*p)++ 分解后就是j=(*p); *p=*p+1; 38、在不同函數(shù)里面的跳轉(zhuǎn)我們要通過一個接口,setjmp ?可以理解成函數(shù)跳轉(zhuǎn)。 ? ? ? ? ? 用一個jmp_buff ?比如:定義一個envbuf,的變量保存函數(shù)狀態(tài),,在底層函數(shù)中使用 ? ? ? ?? ? ?? ?????longjmp(envbuf,5) ?即可,其中5是可以變化的。 39、在什么情況下,需要在主函數(shù)里面定義二級指針。(注意) ? ? ? ?動態(tài)的指針數(shù)組,將一級指針強轉(zhuǎn)化為二級指針,的需求是要用二級指針去存放一級指針的地址。需要解引 ? ? ?? 用兩次。
40、函數(shù)指針和指針函數(shù) ? ? ? ?傳遞一種行為給子函數(shù),即傳遞一個函數(shù)給子函數(shù)。傳遞一個函數(shù)指針(即地址)給子函數(shù)。
? ? ? ?指針函數(shù)就是返回值就是指針的函數(shù)。 ? ? ? ?函數(shù)指針又叫回調(diào)函數(shù),或鉤子函數(shù)。 ? ? ? ?接口就會用到函數(shù)指針的。
總結(jié)
- 上一篇: dispatch的action带参数
- 下一篇: 对unicode数据进行部分replac