c语言中*用于指针,关于C语言中指针的理解
關于c語言中指針的一些理解
這幾天在看任哲老師編寫的嵌入式實時操作系統uC/OS原理與應用一書,第二章講到指針的用法,我發現自己有些地方有疑問,就重新看了關于c指針的知識。同時也對指針有了一定的理解。
在理解指針的時候我們一定要將他跟內存地址聯系起來,這也是c語言跟c++的區別,c語言可以更接近硬件底層。對于指針我們可以理解為其是一個存放內存地址的變量。*跟&,*是聲明一個指針變量,而&是創建一個引用。
我們現在定義一組聲明:
int ?a=112,b=-1;
float ?c=3.14;
int ?*d=&a;
float ?*e=&c;
對于以上的聲明,我們可以用如圖這種方式來表達,每一個小格代表一個內存地址,我們這里定義兩個字節為一個字。100,102,104,106,108這五個整數為地址,我們定義a,b,c,d,e為其地址名字,這樣我們可以通過名字訪問內存地址而不是具體的數字。這些變量名也讓我們更加方便的去訪問內存地址。
在這些聲明中,變量a,b用于存儲整型變量,而c用于存儲浮點型變量,d和e里邊存的是a跟b的地址而不是內容(這點需要我們牢記)d的地址是106內容是100(也就是a的地址)。我們不能理解為變量d和e的值就是112跟3.14。d和e被聲明為指針并不能改變這些表達式的求值方式。也就是說指針型變量有兩點不同于整型變量,一是他對應地址存的內容,二是他的求值方式,不會因為他是指針型變量就將其內容改變為所指變量里的內容。如果你簡單的理解為他是指針,所以可以自動的獲得存儲于位置100和104的值,那么你就錯了。變量的值就是分配給該內存位置所儲存的數值,即使是指針也不例外,只是不同的是他們求值方式會不同。
通過一個指針訪問他所指向的地址的過程稱為間接訪問。用于執行間接訪問的操作符是單目操作符*。
對于上圖所示d的值為100,。當我們使用了間接訪問操作符時,他表示訪問內存位置100并查看那里的值,因此*d的右值為112——位置100的內容,他的左值是位置100本身。間接訪問操作符需要的是個右值,但這個操作符所產生的結果是個左值。指針變量之所以可以作為左值,不是因為他們是指針,而是因為他們是變量。對指針變量進行間接訪問表示我們應該訪問指針所指向的位置。
我們來看一個表達式:
*&a=25,
這個表達式的意思是將25賦值給a。我們來分析這個表達式。&a表示取a的地址。他是一個指針常量(使用這個指針常量并不需要知道的實際值,因為a我們已經定義了此內存地址的名字。*操作符訪問其操作數所表示的地址。在這個表達式中*的操作數是a的地址,所以25直接存于a所對應的那個內存空間中。
我們接下來看指針的指針
int ?a=12;
int ?*b=&a;
c=&b;
c我們定義的是一個指針,這個指針是指向b這個指針的指針,而它所指向的那個指針是一個指向整形的指針。
1.int *p;
2.int **p;
3.int *p[10];
4.int (*p)[10];
5.int *p(int);
6.int (*p)(int);
7.int (*p[10])(int);
對于上述的7條分別是:
1.指向整型的指針
2.指向指針的指針,而他所指向的指針是一個指向整型變量的指針
3.一個有10個指針的數組,這十個指針分別指向十個整型變量
4.一個指針,指向有十個整型數據的指針
5.一個函數(不是函數指針),函數有一個整型參數,返回值是一個指向整型的指針
6.函數指針,該函數有一個整形參數,返回值是一個整型類型
7.一個有十個指針的數組,該數組中的指針指向一個函數,該函數有一個整型參數并返回一個整型數
總結
以上是生活随笔為你收集整理的c语言中*用于指针,关于C语言中指针的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百万粉网红苏乞儿回应骑摩托上高速被拦 网
- 下一篇: 采用 English Tan 皮革,No