當前位置:首頁 » 編程語言 » c語言指針函數理解
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言指針函數理解

發布時間: 2022-12-13 04:18:05

『壹』 c語言中,指針函數和函數指針有什麼區別

在C語言中指針函數和函數指針是兩個不同的概念,不能混淆。
指針函數本質上是函數,是一個返回類型為指針的函數,如:
int* max(int *array,int n)
{
//找最大值的地址
return 最大值的地址;
}
max就是一個指針函數。
而函數指針本質上是指針,是指向函數的指針,如:
int (*funp)(int a,int b);
funp就是一個函數指針,可以用它指向一個返回類型為int、有兩個int類型的參數的函數。

『貳』 怎麼理解C語言里的指針

解,個人覺得指針是一個有用的定址的輔助工具,程序編著編著就會想用,再接下來,還會給C語言創新功能。
1)數序函數是中學學過的,函數有定義域,而定義域里的數據一般都是有序或有機的,在C裡面變為數組;
2)上述數據將被按地址逐個存放在計算機內存中,1)所述數據不例外
3)函數的本意就是對可操作的數據進行映射,因此在處理那些定義域的數據可以使用數據地址找到,非常方便,快捷。
不過,使用指針時別弄錯,弄錯了,語法是檢查不出來,可是結果卻會出來一個莫名其妙的數據,指針不知道指到哪個位置了,而那些位置都有數據,不過和本程序會無關。

『叄』 論述C語言中指針的概念和作用,並舉例說明

1、指針概念:變數的地址(計算機內存位元組的編號)叫做指針,存放變數地址的變數叫指針變
量,
簡言之,指針是用來存放地址的。
2、作用:指向這個變數或數組的首地址,是變數的間接引用方式。其值如果改變,變數的值或數組元素的值也會跟著改變。程序對變數的操作實際上是對變數所在的存儲空間讀取和寫入數據。方便對變數的操作。
舉例說明:
int
a=3;/*定義一個整型變數a,並賦初值3*/
int
*p;/*定義一個指針變數P*/
p=&a;/*讓p指向a的首地址,也就是a的地址*/
程序為a分配一個2個位元組的存儲單元,假如2個位元組的地址分別為(ABCD1和ABCD2,唯一),那麼p裡面放的值就是ABCD1,不是3。這時可通過p直接引用a,實際上*p=3。以後不管a存放在內存中的哪個地方,只用通過調用p就可以引用a。這時如果令*p=4,則最後的a值也為4。對於數組,指針是指向數組的首地址。

『肆』 怎麼理解C語言里的指針

指針就是內存的地址。

內存懂吧,就是放數據的地方,數據就像一個人的家,懂吧,一棟樓里,肯定住了不止一家人吧,那麼確定每家的地址,就需要幾樓幾零幾這樣設置地址吧。內存也是一樣的,內存是按一個位元組的大小來安排地址的。
比如int a;我們申請了一個int型,整形的變數,int是四個位元組的數據類型,所以變數a在內存上會有一個地址,地址是按第一個數字為準的。假設內存上沒有任何數據,都是空的,那麼內存就會按順序來放地址,假設內存的第一個地址是0,以此類推,那麼當我們int a變數的時候,內存就會把0-3地址的空間分配給變數a,因為a佔四個單元內存,那麼怎麼確定變數a的地址呢?計算機是按這個內存地址上的最開始那個算的,即變數a的地址是0。
當我們在聲明了int a變數之後,再聲明一個char b變數。如下:
int a;
char b;
這個時候,int a先被聲明了,假設內存是空的,那麼變數a就會被安排0-3的地址。第二個聲明char b;就會接在變數a之後,因為char是一個位元組的數據,所以內存只會分配一個4號內存給變數b,變數b的地址就是4。以此類推,其他類型是一樣的。
指針就是用來存放內存地址的地方。指針變數一般也會單獨存放。
比如:
int a; //內存分配編號為0-3的內存空間給變數a;變數a的地址就是最開頭的那個編號即變數a的地址是0;
char b; //內存緊接著分配編號為4的內存空間給變數b,因為char是一個位元組的,所以變數b的地址唯一,就是4。
隨後,我們申請指針。
int * p;
char * t;
我們申請了兩個指針, *是指針的標志,有*的變數是指針,沒有*的是一般變數,*只是用來區別變數是int型數據還是指針。
當變數是指針的時候,意味著這個變數只能存放內存地址,而不能存放任何自然數。
即指針p,只能用p=&a; 變數a在C語言中,單用的時候,使用變數a裡面存放的值,而不是他的地址,比如 我們再聲明一個變數 int g; g=a;這個例子里,我們聲明了一個int型變數g,並用g=a來初始化g,g=a的意思是,用a里存放的數,即讀取出a裡面存的數,然後把這個數給g,並不是把a的地址給g。所以C語言里規定了符號&為取地址操作符,p=&a;的意思就是取出a的地址,給p,這個時候是可以的,因為p是指針,並且p指針指向的類型是int。
在C語言中,給指針賦地址,要檢查變數的類型的,比如int *p;這個指針p,p前面的*表示他是指針,說明他只能存放地址,*號前面的類型說明符,進一步說明,p這個指針只能存int型變數的地址,即如果p=&b;是不會成立的,並且會報錯,因為p是一個存放int型變數的指針,而變數b是一個char型變數,在C語言里,指針和對應的變數的類型要一致。不能夠混用。
不能混用的原因在於,到時候解引用的時候會出錯,即如果 p=&b,成立的話,那麼到時候使用 a=*p;的時候會出現嚴重錯誤,因為p=&b,是把char型變數的地址給int型指針,當我們在使用解引用符號*的時候,就會錯誤,a=*p;的意思是,用p里存放的地址,找到內存上的數據,並且給變數a,編譯器會檢查,得知p是int型變數指針,所以需要按照這個地址取出的數據是四個位元組的數據,所以程序會把b的地址4按照int型的數據變數地址來使用,會調取內存上編號為4,5,6,7號位的數據,然而編號為4的內存上放的是char 型變數b的數據,5,6,7號內存上,根本沒有數據,從而出錯。所以C語言嚴格要求,指針的類型和變數類型要一致,即int *的指針只能存放int型變數的地址,不可混用。
最後一個疑問點在於*符號,在C語言里是復用的,即有三種使用方法,這里給你區別一樣,要不然你會有疑問,* 這個符號,在C語言有三種意思,一種是乘法,即 a=5*3里,這個時候這個符號*是乘法的意思,認出他很簡單,因為乘法必須要有乘數,被乘數,即符號*左右兩邊都要有實數或者變數,即使是c=a*b;的表達也不會錯,a,b是變數的話,符號*是乘號用法。
第二種用法就是我們看到的 int *p;這裡面符號*是指針的標志,只是用來說明p是一個指針,假設一個int p,那請問怎麼區別p是指針還是變數,所以就是通過添加符號*來區別變數和指針的,而且指針和變數一樣,都需要int,char,double等類型說明,所以只有在聲明變數的時候,才使用。
第三中用法就是和符號&的操作相反的操作,符號&在C語言里,只有一個用法,就是表明,這個運算符是取出後面的地址,即&a,就是取出變數a的地址,即指針,符號&左邊沒有任何變數,只有右邊有變數,而符號*則是相反操作,意思是取出符號*右邊的指針里的地址,並取出這個地址里存放的數,所以*P,就是取出指針p里的地址,然後取出這個地址里存放的數。符號*也是右邊有變數,而左邊沒有任何變數的操作,他們都是單操作符。
第二種和第三種用法要怎麼區別,就是第三種一定是a=*p這樣使用的,符號*的左邊一定沒有任何類型說明符,而如果是第二種用法,那麼符號*的左邊一定有類型說明符,即第二種一定是int *p; 即 類型說明符 + * +變數名的形式,而且只用在聲明指針變數的時候。

『伍』 C語言中的函數指針和指針函數怎麼理解

簡言之,函數指針就是指向函數(函數入口地址)的指針,指針函數就是返回數據類型為指針的函數
函數指針:void (*fun)(); 指針函數:type *fun();其中type為數據類型,比如char,int等等

『陸』 c語言指針是什麼意思!

指針其實是一個整形變數,與其它數據不同的是,它的作用是用來存儲其它變數的地址。指針(Pointer)是編程語言中的一個對象,利用地址,它的值直接指向(points to)存在電腦存儲器中另一個地方的值。由於通過地址能找到所需的變數單元,可以說,地址指向該變數單元。

因此,將地址形象化的稱為「指針」。意思是通過它能找到以它為地址的內存單元。

再打個比方:有個人讓你去麥當勞幫我買個雪糕,那麼麥當勞是這個變數a,但是那個人現在把麥當勞所在的地址寫在紙上給你,那麼這張紙就可以看做一個指向麥當勞的指針。

(6)c語言指針函數理解擴展閱讀

舉例說明:

int p; //這是一個普通的整型變數。

int *p; //首先從P 處開始,先與*結合,所以說明P 是一個指針,然後再與int 結合,說明指針所指向的內容的類型為int 型.所以P是一個返回整型數據的指針。

int p[3]; //首先從P 處開始,先與[]結合,說明P 是一個數組,然後與int 結合,說明數組里的元素是整型的,所以P 是一個由整型數據組成的數組 。

int *p[3]; //首先從P 處開始,先與[]結合,因為其優先順序比*高,所以P 是一個數組,然後再與*結合,說明數組里的元素是指針類型,然後再與int 結合,說明指針所指向的內容的類型是整型的,所以P 是一個由返回整型數據的指針所組成的數組。

int (*p)[3]; //首先從P 處開始,先與*結合,說明P 是一個指針然後再與[]結合(與"()"這步可以忽略,只是為了改變優先順序),說明指針所指向的內容是一個數組,然後再與int 結合,說明數組里的元素是整型的.所以P 是一個指向由整型數據組成的數組的指針。

int **p; //首先從P 開始,先與*結合,說是P 是一個指針,然後再與*結合,說明指針所指向的元素是指針,然後再與int 結合,說明該指針所指向的元素是整型數據。由於二級指針以及更高級的指針極少用在復雜的類型中,所以後面更復雜的類型就不考慮多級指針了,最多隻考慮一級指針。

int p(int); //從P 處起,先與()結合,說明P 是一個函數,然後進入()里分析,說明該函數有一個整型變數的參數,然後再與外面的int 結合,說明函數的返回值是一個整型數據。

Int (*p)(int); //從P 處開始,先與指針結合,說明P 是一個指針,然後與()結合,說明指針指向的是一個函數,然後再與()里的int 結合,說明函數有一個int 型的參數,再與最外層的int 結合,說明函數的返回類型是整型。

所以P 是一個指向有一個整型參數且返回類型為整型的函數的指針。

int *(*p(int))[3]; //可以先跳過,不看這個類型,過於復雜從P 開始,先與()結合,說明P 是一個函數,然後進入()裡面,與int 結合,說明函數有一個整型變數參數,然後再與外面的*結合,說明函數返回的是一個指針。

然後到最外面一層,先與[]結合,說明返回的指針指向的是一個數組。然後再與*結合,說明數組里的元素是指針,然後再與int 結合,說明指針指向的內容是整型數據.所以P 是一個參數為一個整數據且返回一個指向由整型指針變數組成的數組的指針變數的函數.

『柒』 c語言指針怎麼理解,什麼時候會用到指針,要注意哪些方面

cpu自己有運算器和寄存器,通過匯流排與存儲器件相連,在執行運算時,
需要將數據沖存儲器件上面將參與運算的數據讀入,運算完成後再送出到
存儲區。那麼cpu讀入時需要訪問存儲器件的某個單元,需要指定這個單元
的編號,我們管這個編號叫存儲地址。
比如:int a[10],*p; p=&a[3];a就是一個擁有10個整型數據的數據區
的首地址,變數p是存放地址的,稱為指針型變數,賦值時需要取相應存儲
區的地址,p=&a[3];就是取數組a的第4個單元的地址給p,那麼p就拿到了
這個單元的地址,*p=5;就相當於a[3]=5;的操作,p++;後p指針就指向a[4]。
在操作大塊數據時,一般記錄首地址(數組指針),然後根據首地址再加
上偏移量來訪問整個數據,在你程序中寫a[3]時,計算機就會取a數組對應
的首地址再加3個整型偏移量來訪問相應數據。用指針p訪問a數組的好處
是,不用每次計算a加多少偏移訪問數據,而是使p指向某數據後可以p++
或p--來訪問前一個或後一個數據。
注意:
1.指針存放地址用,不是存儲實際數據的,它是用來找數的,在
程序中要注意這點,往往出問題的是,指針還沒有賦值就用來操作,或
用指針來存放數據,如:int *p=15,s[10]={ 0,15,{0} };的
p指針賦值有問題,這樣計算機會把15當成地址存放到p變數中,以後用
*p訪問得到的數據就不是你想要的數據了。(應該類似:p=s+1; *p=15;)
2.指針訪問數據區一般需要程序來控制不要越界,比如定義了10個單元
的數據區,你不能讓指針超出這10個單元的范圍,否則得到的數據就是
不靠譜的。
3.指針的定義只是開設了可以訪問數據區或數組的變數,數據區和數組
需要你的程序另行開設,然後把數據區或數組的某個單元的地址賦值給
指針變數,不要認定義了能訪問數組的指針,數組就定義好了。
4.指針存放的地址最好不要用來與其他地址比較,除非你能確認地址比
較的結果肯定是你想要的。
5.舉例來說,int a[10],*p=a;中a和p都是指針(地址),但a和p是不同的
在編譯器眼中,a是一個數據區的首地址,是一個標記,你程序中使用a
時,編譯器會知道用數據區的首地址來替換操作,而p是你自己程序開
設的變數,可以在程序中操作比如p++; p=a;等,但作為記號的a就不能
在程序中操作了,如a++; a=p;就是錯的了。
6.子程序如果參數是指針型的,這個參數由子程序開設的指針型臨時
變數存儲,這個臨時變數可以進行操作,但不會返回給調用者的指針型
變數。
如:int a[10],*p; int f(int *s) { s++; } main() { p=a; f(p); }
s再怎麼加減都不會影響p。

『捌』 C語言指針函數和函數指針詳細介紹

  • 01

    指針函數通常是指函數返回值是指針的一類函數,如圖所示。

  • 02

    函數指針是指指向某個具體函數的指針變數,在程序設計時可以用來調用某個特定函數或者做某個函數的參數。其形式一般如圖:

  • 03

    指針函數與函數指針本質上的區別是,指針函數是一個帶指針的函數,總的來說還是一個函數,如圖就是一個帶*name指針的函數

  • 04

    函數指針是指向函數的指針變數,本質上還是一個指針,其格式如下,可以看到和指針函數的格式非常像,所以一定要用心留意。