《黑馬視訊13期》提高班01
- 資料型別的本質(如Int、double等):告訴編譯器預算物件分配的記憶體大小,固定記憶體大小的別名。int(4個位元組),double(8個位元組)。
- 為什麼在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,都是指標變數,但是其指向的型別不一樣。