1. 程式人生 > >《黑馬視訊13期》提高班01

《黑馬視訊13期》提高班01

  1. 資料型別的本質(如Int、double等):告訴編譯器預算物件分配的記憶體大小,固定記憶體大小的別名。int(4個位元組),double(8個位元組)。
  2. 為什麼在32位系統下,指標佔4個位元組?64位佔8個位元組?

虛擬記憶體。32位系統最大能開闢4G(2的32次方)的虛擬記憶體,地址為0x00000000~0xffffffff,所以指標佔4個位元組。而64位能開闢128G虛擬記憶體。

     3. int array[10];         array是陣列的首地址(本質就是int *),而&array是陣列的地址(int[10]*) ,所以array和&array+1偏移量是不同的,前者偏移4個位元組,後者偏移40個位元組。

     4 void *,萬能指標。eg:void* memcpy(void *dst, const void *src, size_t len);

     5 地址其實就是個數值。int a = 10; int addr = (int)&a; *((int*)addr) = 200; 若a的地址是7339369,則*((int*)7339369)) = 200;

     6 程式的記憶體四區模型:程式碼區(作業系統管理,存放程式的二進位制程式碼)、全域性區(靜態區static)(常量(如字串常量)和全域性變數、作業系統管理)、棧區stack(程式區域性變數)、堆區heap(作業系統管理)。

char *a = "1234546",在函式裡,a在棧區,而“1234546”是字串常量在全域性區。字串常量是無法修改的。

舉個列子,說明字串常量和區域性變數

char* test1(char *dst)
{
    dst = "1111";
    return dst;
}

char* test2()
{
    char a[] = "1111";
    return a;
}

void main()
{
    char *p = NULL;
    p = test1(p);
    printf("%s",p);   //輸出成功
    
    p = test2();
    printf("%s",p);  //錯誤輸出
}

 

 

    7 當在堆上開闢空間時,最好先初始化為0。這樣可以避免一些字串拷貝等問題(\0)

int HeapCreate(int size)
{
    int *p = NULL;
    p = (int*))malloc(size * sizeof(int));
    if(p == NULL)
    {
        fprintf(stderr,"malloc %d,err",size);
        return 1;
    }
    
    //初始化
    memset(p,0,size * sizeof(int));
    
}

而對於C++中的new,初始化的時候,注意三點:

(1)元素只能初始化為元素型別的預設值,而不能像陣列變數一樣,用初始化列表為陣列元素提供各不相同的初值。

(2)對於內建資料型別元素的陣列,必須使用()來顯示指定程式執行初始化操作,否則程式不執行初始化操作:

(3)類型別元素的陣列,則無論是否使用(),都會自動呼叫其預設建構函式來初始化:

int *p = new int[5];  //每個元素沒有初始化
string *str = new string[5];  //每個元素呼叫建構函式初始化

//

int *p = new int[5](); //每個元素初始化為0

 

     8 指標也是資料型別,32位佔4個位元組。指標只不過儲存的是地址。二級指標儲存的是一級指標的地址。不管二級三級指標,都是佔4個位元組,都是資料型別。指標在記憶體的地址和指標指向的地址是兩個完全不同的概念。如int *p1,double *p2,都是指標變數,但是其指向的型別不一樣。