詳解C語言中的取值運算子

2021-10-04 18:56:49 字數 2299 閱讀 9386

乘法運算子

int x =1;

int y =2;

int z = x*y;

定義新的型別

char x;

char

* x1;

char

** x2;

取值運算子

格式:

*+ 指標型別的變數

int* a =

(int*)

1;printf

("%x \n"

,*a)

;

這裡舉乙個例子分析一下:

#include

//標頭檔案

#include

void

main()

//程式入口

原因很簡單,我們去反彙編看一下問題出在**:

這是它的彙編指令,我們簡單分析一下:

00401028   mov         dword ptr [ebp-4]

,1//把1賦值給ebp-4,也就是第乙個變數

0040102f mov eax,dword ptr [ebp-4]

//把ebp-4的值存到eax裡

00401032 mov ecx,dword ptr [eax+4]

//這裡出問題了,把eax+4這個位址裡的值取出來存到ecx裡

00401035 push ecx //ecx壓棧

00401036 push offset string "%x \n"

(0042201c)

//壓入字串

0040103b call printf (

00401070

)//呼叫printf()函式輸出結果

00401040 add esp,

8//平衡堆疊

pinrf

("%x \n",*

(a+1))

;

這裡的a+1並不是真的+1,在反彙編中也看到了,是+4,原因就是指標變數加減的多少,取決於去掉* 以後的資料型別的寬度是多少,這裡是int,自然就+4,如果是a+2,那就是+8了。

這個標題可能有點繞,意思就是看一下當編譯器遇到賦值操作的時候是怎麼處理的,看一下這個例子:

#include

#include

int*

** a;

int*

** b;

int*

** c;

void

mian()

看一下它的報錯:

就是我們定義的指標int* a,編譯器在這裡把int*** a當作了int**型別來處理,在原先的基礎上減少了乙個*,那我們定義五個 *來驗證一下:

#include

#include

int***

** a;

int*

** b;

int*

** c;

void

mian()

看一下報錯,跟我們推斷的一樣:

如果**是這樣就不會報錯了:

int

* a;

void

main()

這裡這兩個例子注釋的已經比較詳細了,這裡就不過多分析,感興趣的可以自己去看一下反彙編,並不難理解。

例1:

#include

//標頭檔案

#include

void

mian()

//入口函式

例2:

#include

//標頭檔案

#include

int x =1;

//把1賦值給x

void

mian()

//程式入口

C語言中的運算子

c語音中的運算子,按其功能,可以分為 算數運算子,關係運算子,邏輯運算子,自增和自減運算子,按位運算子,賦值運算子,和條件運算子。1 算數運算子 運算元可以為任何基本型別,運算結果的型別和運算元型別相同。2 關係運算子 運算元可以為任何基本型別,一般為整型,運算結果,如果兩個運算元關係成立,則結果為...

C語言中的運算子

c語言中的運算子 一 運算子 1 算術運算子 2 賦值運算子 賦值運算子用 來給變數賦值。注意,在c語言中 不表示相等,而只是乙個運算子。3 增量和減量運算子 在程式開發中,我們經常需要對乙個變數的值執行加1或者減1的操作。例如 x x 1 x x 1 為簡化這種操作,c語言提供了增量運算子 和減量...

c語言中的運算子

c語言運算子 是說明特定操作的符號 它是構造c語言表示式的工具 c語言 的運算異常豐富,除了控制語句和輸入輸出以外的幾乎所有的基本操作都為運算子處理。除了常見的三大類,算術 運算子 關係運算子與邏輯運算子之外,還有一些用於完成特殊任務的運算子,比如位運算子。一 算術運算子 1.加法運算子 除了可以進...