C語言的指針
指針就是地址,指針也是C語言的一種數據類型。
用指針類型定義的變量稱作指針變量,指針變量儲存的不是普通數據而是一個地址,一個變量的地址稱為該變量的指針。
指針變量定義的一般形式為:類型標識符 * 變量名
星號是指針類型的標志。
C語言指針變量的使用需要以下兩個運算符:
&:取地址運算符,它返回運算對象的內存地址。
* :指針運算符,也稱為“間接引用操作符”,它返回指針指的變量的值。
1.取地址運算符 &
& 是一元運算符,返回操作數的內存地址。如果操作數 x 的類型為 T,則表達式 &x 的類型是 T 類型指針(指向 T 的指針)。
取址運算符的操作數必須是在內存中可尋址到的地址。換句話說,該運算符只能用於函數或對象(例如左值),而不可以用於位字段,以及那些還未被存儲類修飾符 register 聲明的內容。
當需要初始化指針,以指向某些對象或函數時,需要獲得這些對象或函數的地址:
float x, *ptr; ptr = &x; // 合法:使得指針ptr指向x ptr = &(x+1); // 錯誤: (x+1) 不是一個左值
2.指針運算符*
相反地,當已具有一個指針,並且希望獲取它所引用的對象時,使用間接運算符 *(indirection operator),有時候這會被稱為解引用運算符(dereferencing operator)。它的操作數必須是指針類型。如果 ptr 是指針,那么 *ptr 就是 ptr 所指向的對象或函數。如果 ptr 是一個對象指針,那么 *ptr 就是一個左值,可以把它(即 *ptr)當作賦值運算符左邊的操作數:
float x,*ptr=&x; *ptr=1.7;// 將1.7賦值給變量x ++(*ptr);// 並將變量x的值加1
在這個示例最后的語句中,ptr 的值保持不變,但 x 的值變成 2.7。
如果指針操作數的值不是某個對象或函數的地址,則間接運算符*的操作結果無法確定。
像其他一元操作數一樣,運算符 & 和 * 具有很高的優先級。操作數的組合方式是從右到左。因此,表達式 ++(*ptr)中的括號是沒有必要的。
運算符 & 和 * 是互補的:如果 x 是一個表達式,用於指定一個對象或一個函數,那么表達式 *&x 就等於 x。相反地,在形如 &*ptr 的表達式中,這些運算符會互相抵消,表達式的類型與值等效於 ptr。然而,不管 ptr 是不是左值,&*ptr 都一定不會是左值。
運算符*在C語言中,有兩種作用:
1 用作乘法,為雙目運算符,形式為a*b, 就是計算數學中的a乘以b。
2 用作取值運算,為單目運算符,根據后續操作數(必須為指針)類型,取其指向的值。
如果你正在學習編程遇到瓶頸,感到迷茫,困惑,值得加入我的【C語言C++學習企鵝圈子】
學習交流,技術探討,面試指導,簡歷修改...還有超多源碼素材等學習資料,零基礎的視頻等着你!
注意:指針運算符和指針說明符
外形上一樣,都是 * 號,但一個用在語句里,一個用在聲明里。
例如:
int *p; 聲明 p 是指針,它可用來指向一個 整形變量。
int (*pf)(); 聲明pf是一個指向函數入口的指針變量,該函數的返回值(函數值)是整型。
int *ap(int x,int y){...} 聲明 函數 ap, 有2個形參,函數調用會返回 一個指針,用來指向一個 整形變量。
指針運算符,也在其操作數的左邊,該操作數是一地址,用*可取得該地址處存儲的變量的值,可做右值,也可做左值。
例如:
int myAge; int *p; //指針說明符
*(&myAge)=24; // 指針運算符,&myAge 是地址,* 是取那個地址里的值的運算,做左值
printf("%d",myAge); p=&myAge;
printf(" %d",*p+1); //指針運算符, 輸出 指針指向的變量的值加1,做右值。
輸出 24 25
今天就分享到這里啦,希望對大家學習有所幫助!