本文目錄一覽:
C語言指針函數?
如果在程序中定義了一個函數,那麼在編譯時系統就會為這個函數代碼分配一段存儲空間,這段存儲空間的首地址稱為這個函數的地址。而且函數名表示的就是這個地址。既然是地址我們就可以定義一個指針變量來存放,這個指針變量就叫作函數指針變量,簡稱函數指針。
那麼這個指針變量怎麼定義呢?雖然同樣是指向一個地址,但指向函數的指針變量同我們之前講的指向變量的指針變量的定義方式是不同的。例如:
int(*p)(int, int);
這個語句就定義了一個指向函數的指針變量 p。首先它是一個指針變量,所以要有一個“*”,即(*p);其次前面的 int 表示這個指針變量可以指向返回值類型為 int 型的函數;後面括號中的兩個 int 表示這個指針變量可以指向有兩個參數且都是 int 型的函數。所以合起來這個語句的意思就是:定義了一個指針變量 p,該指針變量可以指向返回值類型為 int 型,且有兩個整型參數的函數。p 的類型為 int(*)(int,int)。
所以函數指針的定義方式為:
函數返回值類型 (* 指針變量名) (函數參數列表);
“函數返回值類型”表示該指針變量可以指向具有什麼返回值類型的函數;“函數參數列表”表示該指針變量可以指向具有什麼參數列表的函數。這個參數列表中只需要寫函數的參數類型即可。
我們看到,函數指針的定義就是將“函數聲明”中的“函數名”改成“(*指針變量名)”。但是這裡需要注意的是:“(*指針變量名)”兩端的括號不能省略,括號改變了運算符的優先級。如果省略了括號,就不是定義函數指針而是一個函數聲明了,即聲明了一個返回值類型為指針型的函數。
那麼怎麼判斷一個指針變量是指向變量的指針變量還是指向函數的指針變量呢?首先看變量名前面有沒有“*”,如果有“*”說明是指針變量;其次看變量名的後面有沒有帶有形參類型的圓括號,如果有就是指向函數的指針變量,即函數指針,如果沒有就是指向變量的指針變量。
關於C語言指針和函數的問題(追加分)
這麼給你解釋吧,指針就相當是一個門牌號。第一個呢,是因為f()函數的參數是指針,就是“門牌號”,所以他們交換的時候是把門牌號進行了交換。所以當你第二次進行訪問的時候,原來A房間變成了B房間,所以當你想要讓A房間里的人出來的時候,這個時候原來住在裡面的B君就出來了。所以發生了交換。
第二個呢,傳的是形參,形參就是把A君複製一個(我們理解為克隆一個A君),然後克隆一個B君,最後把克隆人交換。然後我們輸出的時候,我們卻要A房間里的人,那個時候,A君還在自己的房間,當然他們出來的時候,就是沒有交換了。如果,要交換,我們可以輸出克隆人。那麼看到的結果就是已經發生了交換。
我把第二個代碼,給你稍微改下,就是輸出克隆人,那麼你就會看到,我們原來交換的只是克隆人了。
============
第二個
#includestdio.h
void main()
{void f(int x,int y);
int a,b;
scanf(“%d,%d”,a,b);
f(a,b);
}
void f(int x,int y)
{int p;
p=x;
x=y;
y=p;
printf(“%d,%d”,x,y);
}
輸入5,9
輸出9,5
===========
有不明白的繼續追問!
C語言求積分的指針調用函數代碼求修改
float integral(float a,float b,(*p)(float x))
應該改為
float integral(float a,float b,float (*p)(float x))
c語言指針型函數
#includestring.h // 導入頭文件string.h
#includestdio.h // 導入頭文件stdio.h
char *fun(char *t) // 定義函數, 名稱fun, 輸入參數為char *, 返回值為char *
{
char *p = t; // 把t的值賦值給p, 相當於p指向與t相同的字符串
return p + strlen(t) / 2; // strlen返回值為字符串長度, 然後p位移其一半(向下取整)的距離並返回值
}
int main(int argc, char *argv[])
{
char *str = “abcdefgh”; // str指向字符串“abcdefgh”
str = fun(str); // str調用fun函數, 參數為str, 並將返回值賦值給str
puts(str); // 此時str指向e, 輸出為“efgh\n”
return 0;
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/237244.html