C語言中位址操作符 的使用

2021-06-05 17:09:57 字數 2429 閱讀 3254

示例一

01#include

02intfind(int*a);

03

04main()

05

15

16intfind(int*a)

17

int b = 1; int test = find(&b); 這樣呼叫時,實際上是進行了:int* a = &b,建立了乙個新的指向b的整型指標a作為find函式範圍內的區域性變數。

示例二函式宣告:int find(int& a); 函式呼叫:int b = 1; int n = find(b);

這樣呼叫時,實際上是進行了:int& a = b,給變數b起了個別名a,也就是說a和b實際上代表的是同乙個變數,呼叫期間沒有建立任何新的變數。

示例三函式宣告:int find(int a); 函式呼叫:int b = 1; int n = find(b);

這樣呼叫時,實際上是進行了:int a = b,也就是普通的變數賦值操作,呼叫期間建立了在find函式範圍內的區域性變數a,它的值與b相同。

c中*、&用法介紹

&在用於計算時就是取變數位址,如int* a = &b,就是將整型變數b的位址取出,賦值給整型指標a,a中的內容就是b的位址,所以a指向b。

*在用於計算時,就是取指標所指向的位址中的值,如int b = *a,就是將整型指標a指向的位址中存放的內容賦值給整型變數b。

01#include

02

03main()

04

上面**中,指標p指向變數a的位址。在c/c++中,每個變數都有其相應的位址,通過在變數識別符號前加&符號即可獲得變數的位址。

那麼我們這麼寫可以嗎?int *p = &0x01000;

這顯然不行。因為對於乙個數值常量,它是沒有位址的。而變數之所以有位址就是因為要有乙個儲存單元對變數進行標識(當然,變數也可以直接對映到某個暫存器)。

我們再看下面的**:

1#include "stdio.h"

2intmain(void)

3

上面**又是怎麼回事呢?

先前已經調查過變數a的位址——0x0012ff60,那麼這裡的指標p實際上也是指向變數a的位址。

首先,將0x0012ff60作為int*,這時它與&a是等價的。

然後*(int*)0x0012ff60表示取變數a的內容。

最後,&*(int*)0x0012ff60表示再脫去*(int*)0x0012ff60的解引用,相當於又變為(int*)&a。

因此,這裡的&與第乙個例子中的&是不同的語義。這裡的&不是取位址,因為乙個*(int*)0x0012ff60不是變數,它是沒有位址的。每乙個變數識別符號在編譯期間,編譯器會為它們建立乙個符號表,其中存放著變數識別符號相應的各種屬性,如型別、位址標識等。位址標識在連線後即可確定邏輯位址值。簡而言之,&作為取位址操作,當且僅當&後面跟著的是變數或函式識別符號。所以這裡的&表示脫去解引用。

再看下面的例子,加深印象:

1#include "stdio.h"

2

3intmain(void)

4

在c++中,&還可以表示引用,這個就不多說了。

01#include "iostream"

02usingnamespacestd;

03

04intmain(void)

05

C語言中的操作符

包括 需要注意的是,操作符的兩邊都必須為整型 其他的操作符既可用於整型,也可用於浮點型資料,其中 中有乙個資料為浮點型執行浮點型資料運算 包括 左移操作符 和右移操作符 左移操作符的移位規則是 左邊丟棄,右邊補0 整數在記憶體中以二進位制補碼的形式儲存,在左移之後,該數並沒有發生改變 右移操作符的移...

c語言中的操作符

1.除了 操作符之外,其他幾個操作符可以作用於整數和浮點數。2.對於 操作符如果兩個操作符都為整數,執行整數除法。而只要有浮點數執行的就是浮點數除法。3.操作符的兩個運算元必須是整數。返回的是整除之後的餘數。左移操作符 左邊拋棄,右邊補0,右移操作符 1.邏輯移位 2.算術移位 按位與 按位或 按位...

C語言中的操作符

c語言操作符有以下幾大類 1.算術操作符 2.關係操作符 3.邏輯操作符 4.位操作符 5.賦值操作符 6.單目運算子 7.逗號運算子 8.條件運算子 9.下標訪問,函式呼叫,結構體成員訪問操作符 如下表 操作符型別 包含算術操作符 移位操作符 位操作符 賦值操作符 單目操作符 sizeof,型別 ...