詳解C 中令人頭痛的 和 操作符

2021-07-02 02:23:59 字數 1793 閱讀 3241

宣告指標

當你宣告乙個整型的時候,指標也是乙個變數:

#include using namespace std;

//**一

int main()

此處我們宣告了乙個指標p,它的型別是int*,別小看這個*對這句話意義的改變,倘若我們忽略這個*號:

//**二

#includeusing namespace std;

int main()

從記憶體角度來考慮,**二在棧中開闢了一塊用於儲存int變數的記憶體

然而**一開闢了兩塊記憶體,乙個是指標p的記憶體,還有乙個是指標指向的int的記憶體

由此可知,*在此的作用是開闢兩塊空間,一塊用來存指標,另一塊用來存乙個變數,該變數的型別定義在*之前,這樣來理解的話,我們也能很迅速的掌握*的語法,能知道*是在**,是int* p而不是*int p了

2. 代表指標所指的位址所描述的內容:

//**三

#include using namespace std;

int main()

當我們成功的宣告了乙個指標p並為其賦值的時候,p就有了兩層含義,既是乙個變數,也是另乙個變數的代表

,而*就起到了改變p含義的作用,p代表著指標本身的值,*p代表著指標所指的位址的值(注意:這裡*p代表的是值,不是位址)

取位址

//**三

#include using namespace std;

int main()

這是&在c++中最常用的含義了,也是最容易理解的含義,套用**三我們發現,『&』符號通常在指標賦值的時候出現,這是因為指標指向的是乙個位址,並不是這塊位址所代表的值,相信這裡也有不初學者產生了誤區吧。

2. 引用引數

//**四

#include using namespace std;

int main()

這個作用只在c++中表現,c語言中是沒有的,變數的引用就相當於給乙個變數取了乙個別名,變數的原名不會變,和原名對應的記憶體位址也不會變,但是現在既可以通過原名改變位址對應的值,也可以用別名改,關鍵是有兩個變數名,但是記憶體中只有一塊與之對應的空間,這種用法更多的用處在函式中:

//**五

#include using namespace std;

int test1(int a);

int test2(int &a);

int main()

int test1(int a)

int test2(int &a)

在test2中,函式的輸入就是乙個int型別的引用,我們都知道,方法中的區域性變數會在方法結束時被銷毀,所以,test1中的a的值在方法結束後不會被改變,而引用的變數在方法之外被申明的,所以並不參與這個銷毀過程,所以值被改變了。除此之外,函式中引用變數,還可以減少物件拷貝對於記憶體的影響,也就是說輸入的變數不會再開闢新的空間來儲存,減少了記憶體消耗,相對於傳入指標的函式而言,也減少了指標不安全性給程式帶來的危害,看到這裡小夥伴們一定要牢記』&』的這個作用,大大的用處!!!

位運算中的『與』運算

1&1=1;

0&0=0;

1&0=0;

101&100=100;

這裡一句話帶過,很簡單的一種二進位制運算,對於大多數人來說,這種用法並不常見,不做過描述。(但是考試黨必學。。。)

指標和引用機制是c++模擬其他語言更強大並且必不可少的功能,明白了這倆符號,你就能很快明白這兩種機制的精髓,相信此文一定對理解c++基礎的你有不小的幫助。

C 中is和as操作符

在c 語言中進行型別轉換的操作符is和as。is和as都是強制型別轉換,但這兩者有什麼相同之處和不同之處呢?在使用is和as需要注意哪些事項?下面我們從簡單的 示例去 這個簡單的問題。is檢查乙個物件是否相容於指定的型別,並返回乙個boolean值 true或者fasle。注意,is操作符永遠不會丟...

C 中的is和as操作符

在c 語言中進行型別轉換的操作符is和as。is和as都是強制型別轉換,但這兩者有什麼相同之處和不同之處呢?在使用is和as需要注意哪些事項?下面我們從簡單的 示例去 這個簡單的問題。is檢查乙個物件是否相容於指定的型別,並返回乙個boolean值 true或者fasle。注意,is操作符永遠不會丟...

C 中的is和as操作符

在c 語言中進行型別轉換的操作符is和as。is和as都是強制型別轉換,但這兩者有什麼相同之處和不同之處呢?在使用is和as需要注意哪些事項?下面我們從簡單的 示例去 這個簡單的問題。注 此博文只是本人學習過程中一些簡要記錄,新手可以看一下,高手略過。is檢查乙個物件是否相容於指定的型別,並返回乙個...