C的常用總結

2021-09-30 12:08:22 字數 2616 閱讀 8640

一、const

它限定乙個變數不允許被改變。使用const在一定程度上可以提高程式的安全性和可靠性。

const int a;         // a 代表乙個常整型數

int const a;         // a 代表乙個常整型數

const int *a;       // a 代表乙個指向常整型數的指標,即a的值是可變的,但是*a是不能變的,函式的一些形參經常會用到

int * const a;      // a 代表乙個常指標,即a的值是不可變的,但是*a是可變的

int const * a const;     // a代表的是乙個指向常整型數的常指標

二、排序

排序方式最常用的有:氣泡排序、直接插入排序、選擇排序、快速排序、希爾排序,當然還有堆排序、歸併排序等

這裡我總結一下演算法,例項在另一篇博文總結:

排序都以從小到大排序,陣列長度為n:

(1) 氣泡排序

冒泡顧名思義就是要冒出來,相鄰的兩個元素進行比較,找到小的那個元素,讓它冒出來,大的那個元素則沉下去,一直比較到最後將最大的那個元素放到第n個元素的位置;

然後繼續上面步驟,找到第2個最大的數,放到n-1個元素的位置;

以此類推,一直到最後乙個元素,當然最後乙個元素肯定就是最小的,也是放到第1個元素所在的位置。

氣泡排序是穩定的,時間複雜度是n的平方(o(n2))。

(2)快速排序

快速排序是對氣泡排序的一種本質改進;它的基本思想是通過一趟掃瞄後,使得排序序列的長度能大幅度地減少。在氣泡排序中,一次掃瞄只能確保最大數值的數移到正確位

置,而待排序序列的長度可能只減少1;

快速排序通過一趟掃瞄,就能確保某個數(基準值,通常我們選第乙個)的左邊各數都比它小,右邊各數都比它大。然後又用同樣的方法(遞迴)處理它左右兩邊的數,直到基

準點的左右只有乙個元素為止;

最理想情況演算法時間複雜度o(nlog2n),最壞o(n2)

(3) 選擇排序

從第2個元素開始,分別與第乙個元素比較,如果比第乙個元素小,那麼就交換,這樣得到的第乙個元素應該是最小的;

重複上一步,從第3個元素開始,分別與第2個元素比較,如果比第乙個元素小,那麼就交換,這樣得到的第2個元素應該是最小的;

以此類推。

選擇排序是不穩定的,時間複雜度是n的平方(o(n2))

(4) 直接插入排序

一般不明確前面順序的話,就從第2個元素開始插入;

插入的時候,後面的元素就需要後移,所以,目前元素是j,那麼就需要與j-1比較,如果比j-1小,就交換。也就是說插入到j-1的位置,原來j-1位置的元素就後移到j的位置;

重複上面步驟,一直到j元素的值不比j-1小;

然後再將j+1元素往直前j個元素裡面插;

重複將j+2元素往裡面插,一直到第n個元素。

直接插入排序也是穩定的,時間複雜度是n的平方(o(n2))

(5) 希爾排序

在直接插入排序演算法中,每次插入乙個數,使有序序列只增加1個節點,並且對插入下乙個數沒有提供任何幫助。如果比較相隔較遠距離(稱為增量)的數,使得數移動時能跨過多個元素,則進行一次比較就可能消除多個元素交換。d.l.shell於2023年在以他名字命名的排序演算法中實現了這一思想。演算法先將要排序的一組數按某個增量d分成若干組,每組中記錄的下標相差d.對每組中全部元素進行排序,然後再用乙個較小的增量對它進行,在每組中再進行排序。當增量減到1時,整個要排序的數被分成一組,排序完成。

三、暫存器操作

[cpp]

view plain

copy

#define set_reg(addr,val)                wr(addr, val)

#define get_reg(addr)                    rd(addr)

#define set_bits(addr,val,start,len)     wr(addr, (rd(addr)&(~(((1l<

#define get_bits(addr,start,len)         (rd(addr)>>(start)) & ((1l<

#define set_bit(addr,val,index)          set_bits(addr,val,start,1)

#define get_bit(addr,index)              get_bits(addr,index,1)

四、指標

1、指標,其實完全可以看做乙個位址。

2、指標變數,說明這個指標是可變的,就相當於int a,a也是個變數,只不過a的值是個整型,而指標變數代表的是可變的位址。

定義的時候怎麼表示指標?就用到了符號「*

」,int *p;說明p是個指標變數,位址p裡面放的是乙個整型數。

3、指標變數使用跟普通變數乙個,例如int a;a = 4;a只能賦值乙個整型數。int *p;p = (int *)0x12345;或p = &a;

如果需要獲取位址p所指的值,同樣用到符號「*

」。p = &a;那麼*p就是a的值也就是4。

4、指標表示一維陣列,a[i] 就是

*(p+i)

5、指標表示二維陣列,a[i][j]就是

*(*(p+i) + j)

6、指標函式,即返回值是指標的函式。函式指標,即指向函式的指標

C 常用方法總結

stringbuilder類 可以修改的string system.text.stringbuilder sb new system.text.stringbuilder string str sb.tostring string的 號 string str1 my documents my fil...

C 常用型別總結

最近在學c 其中一些常用的但不熟悉的型別總結如下 pair 型別 經常要用到含有二維引數的一些物件,比如乙個點的橫縱座標,乙個人們名字的first name和last name。requirment header file include eg typedef pair point t points...

C 中常用的函式總結

1.字串轉數字函式 字串轉數字是程式設計中常見的需求,自己手寫這個需求倒不是很難,但是如果有直接可以呼叫的庫則是十分便捷的。為此,c 標準庫提供了一系列的字串轉數字的函式。常用的如下 1.1stoi 函式 include include include using namespace std int...