陣列
例子1:int a[3] = ;
先記住幾個概念,
(1)陣列名代表的是一塊記憶體的名稱,即例1中,a代表的是一塊記憶體的名稱,這個記憶體的大小是sizeof(a) = sizeof(int)*3 = 12
(2)陣列名不能作為左值,只能作為右值。
左值是指值可以改變的,而右值只能讀。a代表的是一塊記憶體的名稱,如果作為左值,如a=3,意思是對整塊記憶體區域進行賦值為3,這是不允許的。
陣列名作為右值時,代表的是陣列的首元素位址。如a作為右值時,代表的是a[0]的位址,即作為右值時a==&a[0]
注:sizeof(a)中的a代表什麼呢?代表整塊的記憶體區
(3)&a代表的是陣列的首位址,如例子1中,&a代表的是整個陣列a的首位址
注:雖然&a與a(作為右值時)是相等的,但其代表的意義是不一樣的
例項2:
int a[4] = ;
int *ptr1 = (int*)(&a+1);
int *ptr2 = (int*)((int)a+1);
printf(「%x,%x」,ptr1[-1],*ptr2);
&a+1:&a陣列的首位址,因此&a的型別等同於int [4],因此&a+1 =a陣列的首位址+1*sizeof(int[4]),在本例中已經越界了,ptr1[-1]被解釋為*(ptr1-1),故等於0x04
int(a)+1:將首元素位址轉為為整型(此時是沒有任何型別的,只是整數),例如假設
首元素位址為0x12121212,則int(a)+1 = 0x12121213,取值時需要考慮大小端問題。一般作業系統都是小端模式,因此,本例*ptr2解為0x2000
來個二維陣列的例子
例3:int
a[3][4] =,,}
int *pa = (int*)(&a + 1);
printf("%d\n",sizeof(a));
printf("%d\n",*a[0]);
printf("%d\n",a[1][3]);
printf("%d\n",**(a+0));
printf("%d\n",*(*(a+1)+2));
printf("%d\n",**(a + 1));
printf("%d\n",pa[-1]);
說明:(1)a代表記憶體空間的名稱,故sizeof(a)等於sizeof(int [3][4]) = 3*4*4
(2)a作為右值時,代表的是陣列首元素位址,而此時的二維陣列可以當做一維陣列對待,如int a』[3],a』的每個元素擁有四個子元素。
因此a作為右值代表的是這個子陣列的首位址,故(a+1)等同於
首位址+1*sizeof(int [4]) = 的首位址
(3)&a作為整個二維陣列的首位址,故&a+1=首位址+1*sizeof(a)
一些網路概念的模糊認識
dhcp 動態配置ip,分為伺服器和客戶端,如isp提供商會有乙個dhcp伺服器,而每個撥號上網的使用者都是客戶端。dhcp不但會動態配置ip,還會把子網掩碼 閘道器等資訊也自動配置完成。子網掩碼 計算機網路 中學習的子網掩碼,總不能和現實使用中的子網掩碼對應起來,感覺還是不太理解。閘道器 就是 介...
澄清一些概念
參考 以前一直分不清 authentication 和 authorization,其實很簡單,舉個例子來說 你要登機,你需要出示你的 passport 和 ticket,passport 是為了證明你張三確實是你張三,這就是 authentication 而機票是為了證明你張三確實買了票可以上飛機...
Windws OS 一些概念
答 並行是多個執行緒同時進行 併發是多個執行緒在同一時間段內進行。並行優於併發。1.函式呼叫 同步是函式執行完畢才返回,絕大多數函式都是這樣的 非同步是函式開始執行時就返回,自己的執行仍在繼續,本質是多執行緒。2.執行緒排程 同步 各執行緒間有明確的次序關係。互斥 臨界資源某一時刻只能被乙個執行緒訪...