C 指標詳細解讀

2021-08-21 19:45:26 字數 2232 閱讀 4323

一.指標舉例

int p;//普通整形變數

int *p;

int p[3];//p首先與結合,說明p是乙個陣列,然後與int結合,所以p是由整形資料構成的陣列

int p[3];//p首先與結合,所以p是乙個陣列,然後與結合,說明,陣列裡面元素都是指標型別,最後再與int結合。p是乙個由返回整形資料的指標所組成的陣列。

int (*p)[3];//p是乙個指向由整形資料組成的陣列的指標。

二.細說指標

指標是乙個特殊的變數,裡面儲存的值被解釋為記憶體裡的乙個位址。

要搞清楚指標必須知道:指標的型別,指標所指向的型別,指標所指向的記憶體區,和指標本身佔據的記憶體區。(只要遇到指標就思考這四個問題)

2.1指標的型別

從語法的角度來看,只要將指標名去掉,就能得到指標的型別。

(eg)int ptr;//指標型別為int

int** ptr;//int **

int(ptr)[3]; //int()

2.2指標所指向的型別

從語法上看,只要將指標的名字和左邊的*號去掉即可。

(eg)int *ptr;// int

int * ptr;// int

int (*ptr)[3]; //int() [3];

2.3指標的值

指標的值是指標本身儲存的數值,這個值被編譯器當作乙個位址。指標所指向的記憶體區域,就是指標的值所代表的那個位址開始,長度為sizeof(指標所指向的型別)

2.4指標本身所佔的記憶體

指標佔4個位元組長度。

三.指標的算術運算

指標可以加上或減去乙個整數。這種運算和通常的數值的加減運算的意義是不一樣的。

(eg)

char a[20]=」you_are_a_girl」;

int ptr=(int )a;

ptr+=5;

因為ptr指向的型別為int佔4個位元組,上例中,ptr加了5,即ptr+5*4.所以ptr指向了陣列a的合法 範圍之外a[20].

(eg)

char a[20]=」you_are_a_girl」;

char *p=a;

char **ptr=&p;

cout<<**ptr

ptr++;

cout<<**ptr

ptr指標型別為char**,指向的型別為char *,指向的位址為&p,所以ptr++,為&p+4*1。我們只知道a中位址操作,並不知道p中這個位址解位址為多少。所以最後輸出會是乙個隨機值或者非法操作。

四.指標表示式

乙個表示式的結果如果是乙個指標,那麼這個表示式就叫做指標表示式。

(eg)

int a,b;

intarray[10];

int *pa;

pa=&a; //&a是乙個指標表示式

int **ptr=&pa; //&pa也是乙個指標表示式

*ptr=&b; //*ptr和&b都是乙個指標表示式

pa=array;

pa++; //這也是指標表示式

當乙個指標表示式的結果指標已經明確地具有了指標自身佔據的記憶體的話,這個指標表示式就是乙個左值,否則就不是乙個左值。

所以&a不是左值.

五.陣列和指標的關係

陣列的陣列名其實可以看成是乙個指標。看下例:

int arr[10]=,value;

value=array[0];//可寫成value=*arr;

value=array[3];//value=*(arr+3);

valuse=array[4];//value=*(arr+4);

如果將arr看成指標,它指向陣列的第0個單元,型別是int *。

下面總結一下陣列的陣列名(陣列中儲存的也是陣列)的問題:

宣告乙個陣列type array【n】,則陣列名array就有了兩重含義:

第一:它代表整個陣列,型別是type[n].

第二:它是乙個常量指標,指標型別為type *,該指標指向的型別為type,也就是陣列單元的型別,該指標指向的記憶體區就是陣列的第0號單元,該指標自己占有單獨的記憶體區,注意它和陣列第0號單元佔據的記憶體去是不同的,該指標是不能夠修改的,類似array++這樣是錯誤的。

C語言指標解讀

乙個變數在記憶體中所占用儲存單元的位址被稱為該變數的指標。即 指標 僅表示物件在記憶體中的位址。計算機中,記憶體是乙個連續編號或編址的空間。每個儲存單元都有乙個固定的編號,編號稱之為位址。不同的資料型別占用不同位元組的儲存空間,而每個位元組都有乙個位址,一般把每個資料的首位元組位址稱為該資料的位址。...

詳細解讀mysql 詳細解讀MySQL中的許可權

一 前言 很多文章中會說,資料庫的許可權按最小許可權為原則,這句話本身沒有錯,但是卻是一句空話。因為最小許可權,這個東西太抽象,很多時候你並弄不清楚具體他需要哪些許可權。現在很多mysql用著root賬戶在操作,並不是大家不知道用root許可權太大不安全,而是很多人並不知道該給予什麼樣的許可權既安全...

詳細解讀restful

越來越多的人開始意識到,即軟體,而且是一種新型的軟體。這種 網際網路軟體 採用客戶端 伺服器模式,建立在分布式體系上,通過網際網路通訊,具有高延時 high latency 高併發等特點。開發,完全可以採用軟體開發的模式。但是傳統上,軟體和網路是兩個不同的領域,很少有交集 軟體開發主要針對單機環境,...