Flutter 1.22版本新增的Button
阿新 • • 發佈:2020-11-03
&表示取變數的地址值
int main(int argc, const char * argv[]) { int i; char a; i = 30; a = 't'; printf("%p\n%p\n",&i,&a); return 0; } 執行結果: 0x7fff5fbff83c 0x7fff5fbff83b Program ended with exit code: 0
int *p; p表示的是一個指標變數,它的值是某個整型變數的地址。int * 是一個數據型別,叫做指標型別。
記憶體單元的地址稱為指標。專門用來存放地址的變數,稱為指標變數(pointer variable)。在不影響理解的情況下,有時對地址、指標和指標變數不區分,通稱指標。
staic int p1; /p1是指向靜態整型變數的指標變數/
float p2; /p2是指向浮點型變數的指標變數/
char p3; /p3是指向字元型變數的指標變數/
對於指標變數的定義,需要注意以下兩點。
① 指標變數的變數名是“”後面的內容,而不是“p2”、“p3”。“*”只是說明定義的是一個指標變數。
② 雖然所有的指標變數都是等長的,但仍然需要定義指標的型別說明符。因為對指標變數的其他操作(如加、減等)都涉及指標所指向變數的資料寬度。要注意的是,一個指標變數只能指向同類型的變數。上例中的p2只能指向浮點型變數,不能時而指向一個浮點變數,時而又指向一個字元型變數。
指標變數的值只能是變數的地址,不能是其他資料,否則將引起錯誤。 C語言中提供了地址運算子“&”來表示變數的地址,其一般形式為:&變數名;
* — 指標運算子(間接存取運算子)。 如:int a = 100; int * p = &a;
兩個運算子互為逆操作。例如“&a”或者“p”就是取變數a的地址,而“a”或者“ * p”就是取指標變數a所指向的儲存單元裡的內容。通過一個指標訪問它所指向的物件的值稱為變數的間接訪問(通過操作符“”)。
程式碼展示:
int main(int argc, const char * argv[]) { //int a,b; //printf("%d\n",p(a)); //指標的運算 int a = 10; double b = 20; int *p = &a; double *q = &b; printf("a = %d &a = %p\n", a, &a); printf("p = %p p+2 = %p\n", p, p+2); printf("b = %f &b = %p\n", b, &b); printf("q = %p q+2 = %p\n", q, q+2); return 0; } 執行結果: a = 10 &a = 0x7fff5fbff83c p = 0x7fff5fbff83c p+2 = 0x7fff5fbff844 b = 20.000000 &b = 0x7fff5fbff830 q = 0x7fff5fbff830 q+2 = 0x7fff5fbff840 Program ended with exit code: 0
通過上面的例子,我們可以看到,p儲存的地址就是a的地址,對指標變數p進行加2,實則就是相當於在地址上進行偏移同一資料型別佔位元組乘以2,我們已經知道,sizeof(int)是4,sizeof(double)是8。根據程式結果, 整型指標p+2,地址增加了8,相當於兩個整數。double指標q+2,增加了16,相當於兩個雙精度浮點數。注意此程式是在研究指標的運算,列印p+2,q+2代表的地址。並沒有修改對應的記憶體單元的內容。
兩指標相減運算,p-q 運算的結果是兩指標指向的地址位置之間相隔資料的個數。因此,兩指標相減不是兩指標的值相減的結果,而是按下列公式計算出的結果:(p-q)/型別位元組的長度
我們首先首先定義一個結構型別,
struct student { char *name; int ages; };
再根據型別定義結構體變數 struct student stu={"Rose",15};定義一個指標指向結構體型別,struct student *p;把結構體變數stu的地址賦給指標變數p,p=&stu;我們可以有3種方式來訪問結構體中的屬性ages:
stu.ages=15;(*p).ages=15;p->ages=15;不過第三種方式在C語言中只能用來指向結構體。
C++中::的用法:
1、作用域符號前面一般是該類名稱,後面是該類的成員名稱。C++為避免不同的類有相同的成員而採用作用域的方式進行區分,eg:A,B表示兩個類,在A,B中都有成員member,那麼:A::member表示A中的成員member,B::member表示B中的成員member。
2、全域性作用域符號
當全域性變數在區域性函式中與其中某個變數重名時,可以用::來區分,否則區域性變數會遮蔽全域性變數。
3、作用域分解運算子
比如聲明瞭一個類A,類A裡聲明瞭一個成員函式void f(),但沒有在類的聲明裡給出f函式的定義,那麼在類外定義f時,就要寫成void A::f(),表示這個f函式是類A的成員函式。