bean找不到报空指针_为什么C指针可以实现函数间的通信呢?
指針最偉大的意義在于,指針是面向內存的.而變量的本質是一小塊固定大小的內存,不嚴謹的說,它包括:變量名稱 變量地址 和 變量數值.對于其他語言尤其是面向對象語言來說,編程并不面向內存,內存的控制與回收甚至已經安排了具體的算法進行,你只需要進行”宏觀調控”就可以,或者說,內存的處理細節被封裝為不需要程序員具體關注 不準程序員調用.但指針則是C語言提供的一個接口,通過這個接口提供的方法我們才得以操作內存.
在C語言里調用函數時,實際參數傳遞到被調函數后,無論在被調函數進行了什么運算都不會影響它在主調函數的具體數值,因為調用函數會創造實際參數的副本,這些副本都是局部變量,無法影響主調函數.
但是有一個例外,使用指針可以實現函數間的交流,那么這具體的原理,或者說我們應該如何認識指針的這個用法呢?
指針指向變量的實質是,指向變量的那一份內存,如果傳遞指針作為參數,固然,我們仍然會創造實際參數的副本,但是這個副本和原來在主調函數占據形式參數位置的實際參數的指針,指向的內存是一樣的,雖然局部變量隨著被調函數運行完畢,其生命期達到終結,但是內存時不變,只要它不被回收.
那么我們可以舉一個例子,這個例子的內容就是利用指針在被調函數就完成主調函數兩個變量的值的交換操作.
---------下面是代碼-----------
//以下代碼在win10家庭版環境下運行,編譯器TDM-GCC4.9.2
#include<stdio.h>
void interchange(int * , int * );
int main(void)
{
int x = 5 , y =10 ;
printf(“x = %d y = %d n”,x , y);
interchange(&x,&y);
printf(“Now x = %d y = %d”,x,y);
return 0;
}
void interchange(int * u ,int *v)
{
int temp;
temp = *u;
*u = *v;
*v = temp;
}
-----------------分割線----------------------
以上的程序邏輯就是把 兩個整數變量x和y的值交換.
在主函數中,我們調用了函數interchange,該函數的形式參數是兩個指針變量,在被調函數內部,我們可以看到被操作的被運算的是”指針指向的內存”.
作為一元操作符,*的邏輯就是把指針”解引用”,換句話說,對指針指向的內存進行操作,計算機無法進行交換邏輯操作,我們使用賦值操作模擬交換操作,也就是說這個交換的本質是賦值,我們既不是對兩個int類型的變量進行賦值,也不是對兩個指針進行賦值,而是對內存進行賦值.很多教程里說,通過指針解引用,我們訪問了指針指向的變量,但我認為更準確的說法是,我們訪問了指針指向的內存,這兩個主函數地址的副本指向和主函數地址相同的內存,我們對局部指針解引用后的內容進行操作.
我想強調的是,在這里,這兩個指針是局部的,生命期在interchange函數內,函數執行完,它們的內存就會被回收,但是這兩個指針指向的 x 和 y 的內存 在程序執行完之前是不會被回收的,因此,被調函數和主調函數實現了函數通信,但本質上是被調函數和內存的通信.
在下學識淺薄,被指針惡心了一下,便努力尋找資料來解決,得出了自己的一點看法,但這很有可能是錯誤的,如有大牛指出這個理解的不當之處,我一概接受,我在這里寫出這些的目的是不讓其他和我一樣在這方面的認識有問題的人,到處找資料,結果什么也找不到,在此我再次強調,如果有大牛指出這篇文章荒謬可笑這可能是真的,如果這篇文章一點用武之地都沒有,我會自行刪除,如需轉載……隨你們便,反正我也不玩知乎,盡請各位大佬指正.
總結
以上是生活随笔為你收集整理的bean找不到报空指针_为什么C指针可以实现函数间的通信呢?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 古墓丽影崛起卡牌有什么用(中国十大著名古
- 下一篇: 什么软件可以让视频背景虚化