陣列一些模糊概念

2021-06-18 08:03:43 字數 1379 閱讀 1205

陣列

例子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.執行緒排程 同步 各執行緒間有明確的次序關係。互斥 臨界資源某一時刻只能被乙個執行緒訪...