1. 程式人生 > >c++中的一些常見技巧

c++中的一些常見技巧

1、整形陣列賦初值

C/C++不支援陣列整體賦值,可以在宣告陣列時整體初始化。無論陣列有多大,全部初始化為0的操作很簡單,如int a[3000]={0};就可以將a的3000個元素全部置0;若要賦其他值,例如全部賦值為7,寫成int a[3000]={7};則不行,這隻給a[0]賦值為7,其餘的都是0

2、memset函式(將s所指向的某一塊記憶體中的每個位元組的內容全部設定為ch指定的ASCII值, 塊的大小由第三個引數指定,這個函式通常為新申請的記憶體做初始化工作, 其返回值為指向S的指標)

使用:#include <cstring>

char b[5];

memset(b,'a',5);

第一個引數為初始化的字元陣列,第二個為初始化的值,第三個為字元陣列的大小(因為字元佔一個位元組,所以預設為字元陣列的大小)

如果給整形賦初值為1,則不對

00000001000000010000000100000001

3、時間複雜度

我現在給定一個時間t,給定一個n
for(int i=0;i<t;i++)
{
     for(int j=0;j<n;j++)
      {}
}

則其時間複雜度為o(tn)而不是o(n^2)

4、題目比較簡單,主要有一個坑要注意,由於給定的n,m最大可以是1000,如果直接在main函式中開1000*1000的陣列程式會崩潰,所以要把這個陣列設定成全域性變數

5、堆和棧(棧有作業系統限制,空間較小)

區域性變數、 全域性變數、 堆、 堆疊、 靜態和全域性

文章轉自armfly開發板V4軟體開發手冊,分享學習~

 

一個由C/C++編譯的程式佔用的記憶體分為以下幾個部分
(1)棧區(stack)— 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。
(2)堆區(heap) — 由程式設計師分配和釋放,若程式設計師不釋放,程式結束時可能由OS回收。
(3)全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數
和靜態變數在一塊區域, 未初始化的全域性變數、未初始化的靜態變數在相鄰的另一塊區域。
(4)文字常量區 

— 常量字串就是放在這裡的。
(5)程式程式碼區 — 存放函式體的二進位制程式碼。

 

堆疊(stack)是記憶體中的一個連續的塊。一個叫堆疊指標的暫存器(SP)指向堆疊的棧頂。堆疊的底
部是一個固定地址。堆疊有一個特點就是,後進先出。也就是說,後放入的資料第一個取出。
堆(heap)是向高地址擴充套件的資料結構,是不連續的記憶體區域。這是由於系統是用連結串列來儲存的空閒
記憶體地址的,自然是不連續的,而連結串列的遍歷方向是由低地址向高地址。

 

 在高階語言中,程式函式呼叫、函式中定義的變數都用到棧(stack)。
 用malloc, calloc, realloc等函式分配得到變空間是在堆(heap)上。
 在所有函式體外定義的是全域性量。
 加了static修飾符後不管放在在哪裡都屬於靜態變數,存放在全域性區(靜態區)
 在所有函式體外定義的static變量表示在該檔案中有效,不能extern到別的檔案用。
 在函式體內定義的static表示只在該函式體內有效。
 函式中的"armfly"這樣的字串存放在常量區。

 

舉個具體的例子加深大家的理解。

int a = 0; //全域性初始化區, 可以被其他c檔案 extern 引用
satatic int ss = 0; //靜態變數,只允許在本檔案使用
char *p1; //全域性未初始化區
void main(void)
{
int b; //棧
char s[] = "abc"; //棧
char *p2; //棧
char *p3 = "123456"; //123456\0在常量區, p3在棧上。
static int c =0; //全域性(靜態)初始化區
p1 = (char *)malloc(10); //在堆區申請了10個位元組空間
p2 = (char *)malloc(20); //在堆區申請了20個位元組空間
strcpy(p1, "123456"); /* 123456字串(結束符號是0,總長度7)放在常量區,編譯器可能會
將它與p3所指向的"123456"優化成一個地方 */
}