&與*操作符
char ch=
'a';
char
* cp=
&ch;
&操作符為取位址操作符,表示式&ch
是乙個右值,所以&ch
不能作為可被修改的左值
*為間接引用操作符,表示式*cp
實際上是乙個變數,屬於左值;
表示式*cp+1
則相當於將指標cp指向的位址下的內容取出並加1再返回,該表示式為右值;
表示式*(cp+1)
是乙個變數,屬於左值,如果機器的位址匯流排是32位,則指標佔4位元組,*(cp+1)
先取出指標指向的位址,位址值向後移動乙個單元,獲得乙個新位址(該位址為cp指向位址的鄰接區域),然後返回新位址下的內容。
char ch=
'a';
// 二進位制:0110 0001 十進位制:97
ch+1
;// 二進位制:0110 0010 十進位制:98
char
* cp=
&ch;
//向後移動乙個位元組
char
* cp2=cp+1;
int num =6;
int* ip =
#//ip:0x012ff714
//向後移動四個位元組
int* ip2 = ip +1;
//ip2:0x012ff718
注意,位址0x00fefcab只是記憶體中某個位元組的編號;
+ + 和 - - 操作符
先定義乙個指標cp
:
char ch=
'a';
char
* cp=
&ch;
對於前置操作char* cp2=++cp;
,其彙編方式的執行過程為:
mov eax,dword ptr [cp]
add eax,
1mov dword ptr [cp]
,eax
mov ecx,dword ptr [cp]
mov dword ptr [cp2]
,ecx
eax和ecx是常用的暫存器,第一句語句將cp中的資訊讀取到eax,然後在eax中加1,然後再把結果儲存到cp中,第四句將目前cp的資訊讀入ecx,再借助ecx將資訊儲存到cp2;
對於後置操作char* cp3=cp++;
,彙編方式的執行過程為:
mov eax,dword ptr [cp]
mov dword ptr [cp3]
,eax
mov exc,dword ptr [cp]
add ecx,
1mov dword ptr [cp]
,ecx
明顯發現順序發生了變化,先將cp的資訊借助暫存器轉存到cp3,再將cp的資訊加1存回cp;
- - 與上述過程的操作過程一樣,只是增加操作要變成減少;自增運算不只是指標獨有的操作,也可用於其他型別的物件。
初步得出規則,前置操作會先對變數進行操作,再返回值;後置操作則先返回變數的值,再對變數執行操作;
++cp
與cp++
是位址的臨時表示式(不能獲取到這個新物件的位址),只能是右值,注意*(cp++)
和*(++cp)
是可以找到具體物件獲取到位址的,屬於左值。
間接引用*的優先順序小於自增運算,因此*(cp++)
等價於*cp++
,*(++cp)
等價於*++cp
關於++++
,----
運算子
int a=
1,b=2;
int c;
c=a++
+b;//處理為a++,再+b
//如果為:
c=a++
++b;
//處理為a++,++b,不能將兩個物件賦值給c,報錯
先定義指標cp
:
char ch=
'a';
char
* cp=
&ch;
對於表示式++*++cp
,按照優先順序分解為++(*(++cp))
C語言第七課
主要內容 結構體 很重要,掌握 一 結構體的宣告 結構體是一種比較靈活的資料型別,與oc要學的類很相似 結構體是一種自己定義的資料型別示例 struct 結構體名 student 定義乙個學生型別 由結構體型別修飾的變數,叫結構體變數 定義 struct 結構體名 變數名 示例 struct stu...
第七課 C變數
第七課c變數 7.1 c 變數介紹 變數是程式可操作的儲存區的名稱。c 中每個變數都有特定的型別,型別決定了變數儲存的大小和布局,該範圍內的值都可以儲存在記憶體中,運算子可應用於變數上。變數的名稱可以由字母 數字和下劃線字元組成。它必須以字母或下劃線開頭。大寫字母和小寫字母是不同的,因為c 是大小寫...
python第七課(集合)
set 集合是乙個無序不重複元素的集合 無序唯一 支援 union 聯合 intersection 交 difference 差 和 sysmmetric difference 對稱差集 等數 算 建立語法 set1 set 空 set1 set1 set 字典將取key key 唯一 set1 s...