c中的用法
c中的用法的用法你知道嗎?下面小編就跟你們詳細介紹下c中的用法的用法,希望對你們有用。
c中的用法的用法如下:
C中*、&用法介紹
例1、
複製程式碼
#include <stdio.h>
int find(int *a);
main()
{
int b = 1;
int wait, test;
test = find(&b);
printf("記憶體地址為:%d",&test);
scanf("%d", &wait);
}
int find(int *a)
{
return *a;
}
複製程式碼
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相同。
&在用於計算時就是取變數地址,如int* a = &b,就是將整型變數b的地址取出,賦值給整型指標a,a中的內容就是b的地址,所以a指向b。
*在用於計算時,就是取指標所指向的地址中的值,如int b = *a,就是將整型指標a指向的地址中存放的內容賦值給整型變數b。
C語言中,&符號大家一定很熟悉吧,它除了可以作為按位運算“與”之外還有更常用的功能——取變數地址。
複製程式碼
#include <stdio.h>
main()
{
int a = 0;
int wait;
int *p = &a;
printf("The value is: %dn", *p);
scanf("%d", &wait);
}
複製程式碼
上面程式碼中,指標p指向變數a的地址。在C/C++中,每個變數都有其相應的地址,通過在變數識別符號前加&符號即可獲得變數的地址。
那麼我們這麼寫可以嗎?int *p = &0x01000;
這顯然不行。因為對於一個數值常量,它是沒有地址的。而變數之所以有地址就是因為要有一個儲存單元對變數進行標識(當然,變數也可以直接對映到某個暫存器)。
我們再看下面的程式碼:
複製程式碼
#include "stdio.h"
int main(void)
{
int a = 0; // &a = 0x0012ff60
int *p = &*(int*)0x0012ff60;
printf("The value is: %dn", *p);
return 0;
}
複製程式碼
上面程式碼又是怎麼回事呢?
先前已經調查過變數a的地址——0x0012ff60,那麼這裡的指標p實際上也是指向變數a的地址。
首先,將0x0012ff60作型別轉換,轉為int*,即經過(int*)0x0012ff60後,0x0012ff60轉化成了一個地址,這時它與&a是等價的。(類似的: int a = (int)(((int *)0)+4); (int*)0 已經轉化為一個地址了,+4 就是表示在剛才地址上加4,是地址的位移操作。)
然後*(int*)0x0012ff60表示取變數a的內容。
最後,&*(int*)0x0012ff60表示再脫去*(int*)0x0012ff60的解引用,相當於又變為(int*)&a。
因此,這裡的&與第一個例子中的&是不同的語義。這裡的&不是取地址,因為一個*(int*)0x0012ff60不是變數,它是沒有地址的。每一個變數識別符號在編譯期間,編譯器會為它們建立一個符號表,其中存放著變數識別符號相應的各種屬性,如型別、地址標識等。地址標識在連線後即可確定邏輯地址值。簡而言之,&作為取地址操作,當且僅當&後面跟著的是變數或函式識別符號。所以這裡的&表示脫去解引用。
由此我們可以得出:&作為取地址操作時,其行為結果是在編譯時就被確定的;而*,解引用操作(或取內容)操作,其行為結果只能在執行時才可被確定。
再看下面的例子,加深印象:
複製程式碼
#include "stdio.h"
int main(void)
{
int a = 0;
int *p = &*&*&a;
printf("The value is: %dn", *p);
return 0;
}
複製程式碼
在C++中,&還可以表示引用,
複製程式碼
#include "iostream"
using namespace std;
int main(void)
{
int a = 0;
int &r = a;
cout << "The value is: " << r << endl;
return 0;
}