1. c語言中指針怎麼使用
1、使用場景
使用指針時,必須將它指向一個變數的地址或者為它分配空間方能使用,如下所示:
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int a[5]={0,1,2,3,4};
int *b,*d;
int c=2;
int *e=a; //e指向a數組首地址
//*b=2; 無法直接初始化
//printf("%d ", *b);
e=e+2; //移動兩個地址單元
d=&c; //d指向c的地址來表示值
c=4; //修改原c變數的值,d指針的值會發生改變
b=(int *)malloc(sizeof(int));//為b分配一個int型空間來直接存儲值
*b=2;//分配空間後可以直接賦值了
printf("this is e,b,c,d :%d %d %d %d ",*e,*b,c,*d);
2、類型說明
(1)int *a :表示一個指向int型變數的指針,指向的是變數的地址單元
(2)char *b:表示一個指向char變數的指針
*a表示的是這個指針指向地址的值,a為此指針本身的地址,這點要明確,一般用*(a+1)、*(a+2)來表示值,如:
int nums[5]={0,1,2,3,4};
int *a=nums;
printf("%d %d %p ",*a,*(a+1),a);
(1)c語言怎樣讓指針指向函數擴展閱讀:
指針的運算
指針指向變數地址,若原變數的內容發生了變化,它本身也會發生變化,指針之間的運算一般為值運算和地址運算
(1)值運算:直接通過*運算方式,像a+*(a+1),結果為第一個元素與第二個元素相加。
int nums[5]={0,1,2,3,4};
int *a=nums;
(2)地址運算:通過a+i的方式.指針會指向a的下i個地址。
int nums[5]={0,1,2,3,4};
int *a=nums;
a=a+2;
printf("%d ",*a);
結果輸出2。
參考資料來源 :指針-網路
2. C語言中函數指針用法
函數在內存中有一個物理位置,而這個位置是可以賦給一個指針的。一零點函數的地址就是該函數的入口點。因此,函數指針可被用來調用一個函數。函數的地址是用不帶任何括弧或參數的函數名來得到的。(這很類似於數組地址的得到方法,即,在只有數組名而無下標是就得到數組地址。)
怎樣說明一個函數指針變數呢 ?
為了說明一個變數 fn_pointer 的類型是"返回值為 int 的函數指針", 你可以使用下面的說明語句:
int (*fn_pointer) ();
為了讓編譯器能正確地解釋這句語句, *fn_pointer 必須用括弧圍起來。若漏了這對括弧, 則:
int *fn_pointer ();
的意思完全不同了。fn_pointer 將是一個函數名, 其返回值為 int 類型的指針。
2:函數指針變數
在C語言中規定,一個函數總是佔用一段連續的內存區, 而函數名就是該函數所佔內存區的首地址。 我們可以把函數的這個首地址 ( 或稱入口地址 ) 賦予一個指針變數, 使該指針變數指向該函數。然後通過指針變數就可以找到並調用這個函數。我們把這種指向函數的指針變數稱為 " 函數指針變數 " 。
函數指針變數定義的一般形式為:
類型說明符 (* 指針變數名 )();
其中 " 類型說明符 " 表示被指函數的返回值的類型。 "(* 指針變數名 )" 表示 "*" 後面的變數是定義的指針變數。 最後的空括弧表示指針變數所指的是一個函數。
例如: int (*pf)();
表示 pf 是一個指向函數入口的指針變數,該函數的返回值 ( 函數值 ) 是整型。
下面通過例子來說明用指針形式實現對函數調用的方法。
int max(int a,int b)
{
if(a>b)return a;
else return b;
}
main()
{
int max(int a,int b);
int(*pmax)();
int x,y,z;
pmax=max;
printf("input two numbers:/n");
scanf("%d%d",&x,&y);
z=(*pmax)(x,y);
printf("maxmum=%d",z);
}
從上述程序可以看出用,函數指針變數形式調用函數的步驟如下:
1>. 先定義函數指針變數,如後一程序中第 9 行 int (*pmax)(); 定義 pmax 為函數指針變數。
2>. 把被調函數的入口地址 ( 函數名 ) 賦予該函數指針變數,如程序中第 11 行 pmax=max;
3>. 用函數指針變數形式調用函數,如程序第 14 行 z=(*pmax)(x,y); 調用函數的一般形式為: (* 指針變數名 ) ( 實參表 ) 使用函數指針變數還應注意以下兩點:
a. 函數指針變數不能進行算術運算,這是與數組指針變數不同的。數組指針變數加減一個整數可使指針移動指向後面或前面的數組元素,而函數指針的移動是毫無意義的。
b. 函數調用中 "(* 指針變數名 )" 的兩邊的括弧不可少,其中的 * 不應該理解為求值運算,在此處它只是一種表示符號。
3:指針型函數
前面我們介紹過,所謂函數類型是指函數返回值的類型。 在C語言中允許一個函數的返回值是一個指針 ( 即地址 ) ,這種返回指針值的函數稱為指針型函數。
定義指針型函數的一般形式為:
類型說明符 * 函數名 ( 形參表 )
{
…… /* 函數體 */
}
其中函數名之前加了 "*" 號表明這是一個指針型函數,即返回值是一個指針。類型說明符表示了返回的指針值所指向的數據類型。
如:
int *ap(int x,int y)
{
…… /* 函數體 */
}
表示 ap 是一個返回指針值的指針型函數, 它返回的指針指向一個整型變數。下例中定義了一個指針型函數 day_name ,它的返回值指向一個字元串。該函數中定義了一個靜態指針數組 name 。 name 數組初始化賦值為八個字元串,分別表示各個星期名及出錯提示。形參 n 表示與星期名所對應的整數。在主函數中, 把輸入的整數 i 作為實參, 在 printf 語句中調用 day_name 函數並把 i 值傳送給形參 n 。 day_name 函數中的 return 語句包含一個條件表達式, n 值若大於 7 或小於 1 則把 name[0] 指針返回主函數輸出出錯提示字元串 "Illegal day" 。否則返回主函數輸出對應的星期名。主函數中的第 7 行是個條件語句,其語義是,如輸入為負數 (i<0) 則中止程序運行退出程序。 exit 是一個庫函數, exit(1) 表示發生錯誤後退出程序, exit(0) 表示正常退出。
應該特別注意的是函數指針變數和指針型函數這兩者在寫法和意義上的區別。如 int(*p)() 和 int *p() 是兩個完全不同的量。 int(*p)() 是一個變數說明,說明 p 是一個指向函數入口的指針變數,該函數的返回值是整型量, (*p) 的兩邊的括弧不能少。
int *p() 則不是變數說明而是函數說明,說明 p 是一個指針型函數,其返回值是一個指向整型量的指針,*p 兩邊沒有括弧。作為函數說明, 在括弧內最好寫入形式參數,這樣便於與變數說明區別。 對於指針型函數定義,int *p() 只是函數頭部分,一般還應該有函數體部分。
main()
{
int i;
char *day_name(int n);
printf("input Day No:/n");
scanf("%d",&i);
if(i<0) exit(1);
printf("Day No:%2d-->%s/n",i,day_name(i));
}
char *day_n
ame(int n)
{
static char *name[]={ "Illegal day",
"Monday",
"Tuesday",
"Wednesday",
"Thursday",
"Friday",
"Saturday",
"Sunday"};
return((n<1||n>7) ? name[0] : name[n]);
}
本程序是通過指針函數,輸入一個 1 ~ 7 之間的整數, 輸出對應的星期名。指針數組的說明與使用一個數組的元素值為指針則是指針數組。指針數組是一組有序的指針的集合。指針數組的所有元素都必須是具有相同存儲類型和指向相同數據類型的指針變數。
指針數組說明的一般形式為: 類型說明符 * 數組名 [ 數組長度 ]
其中類型說明符為指針值所指向的變數的類型。例如: int *pa[3] 表示 pa 是一個指針數組,它有三個數組元素, 每個元素值都是一個指針,指向整型變數。通常可用一個指針數組來指向一個二維數組。 指針數組中的每個元素被賦予二維數組每一行的首地址,因此也可理解為指向一個一維數組。圖 6—6 表示了這種關系。
int a[3][3]={1,2,3,4,5,6,7,8,9};
int *pa[3]={a[0],a[1],a[2]};
int *p=a[0];
main()
{
int i;
for(i=0;i<3;i++)
printf("%d,%d,%d/n",a[i][2-i],*a[i],*(*(a+i)+i));
for(i=0;i<3;i++)
printf("%d,%d,%d/n",*pa[i],p[i],*(p+i));
}
本常式序中, pa 是一個指針數組,三個元素分別指向二維數組 a 的各行。然後用循環語句輸出指定的數組元素。其中 *a[i] 表示 i 行 0 列元素值; *(*(a+i)+i) 表示 i 行 i 列的元素值; *pa[i] 表示 i 行 0 列元素值;由於 p 與 a[0] 相同,故 p[i] 表示 0 行 i 列的值; *(p+i) 表示 0 行 i 列的值。讀者可仔細領會元素值的各種不同的表示方法。 應該注意指針數組和二維數組指針變數的區別。 這兩者雖然都可用來表示二維數組,但是其表示方法和意義是不同的
3. c語言如何在局部函數里,改變指針的指向
1、如果函數參數直接傳遞的是指針類型,那麼在函數內改變指針指向,並不能影響函數外的指針實例。只有傳入指針的指針,才能改變指針的指向。
2、函數里的形參是一般變數,在函數裡面改變變數的值,不會改變主函數里實參的值。指針就是地址變數,在函數里改變地址變數的值時,不會改變主函數實參地址變數的值。只有在函數里改變指針所指向的變數的值時
主函數實參指針所指向的變數的值才會改變。
4. c語言指針用法有哪些 如何應用
在下文中,我將會告訴大家c語言的指針都有哪些用法。
c語言指針用法
int t 定義整薯尺型變數
int *p:p為指向整型數據的指針變數。
int a[n]:定義整型數組a,它有n個元素。
int *p[n]:定義指針數組p,它由n個指向整形數據的指針元素組成。
int (*p)[n]:p為指向含n個元素的一維數組的指針變數。
int f():f為返回整型函數值的函數。
int *f():p為返回一個指針的函數,該指針指向整型數據。
int (*f)():p為指向函數的指針,該函數返回一個整形值。
int **p:p是一個指針變數,它指向一個指向整形數據的指針變數。
c語言的應用
驅動程序,無論是操作系統或者單片機,對硬體的驅動除了匯編(比較繁瑣),都是用C語言來編寫。
系統服務,由於操作系統都提供了C語言的API,並且C語言的執行效率比較高,所以用C語言來寫系統服務是最適合不過的。
應用軟體,由於C語言沒有成熟的開發框架,所以不適合開發大型應用程序。但也有一些對效率要求比較高的程序使用C語言開發,如Git。
應用范圍廣泛,具備很強的數據處理能力,不僅僅是在軟體開發上,而且各類科研都需要用到C語言,適於編寫系統軟體,三維,二維圖形和動畫。具體應用比如單片機以及嵌入式系統開發。
C語言是面向過程語言,C語言通過windows平台下編譯的,是直接運行在windows平台下的,而Java始終此旦是運行森手擾在他的虛擬機之上的;所以理論上C語言能做一些相對於比較底層的工作,像Java就不能編寫Windows病毒。
5. 關於c語言指針調用函數。。。。。。。。
第一行,定義一個函數指針p,該函數有兩個整型形參,且返回整型數據;第二行,讓函數指針p指向一個地址,該地址應該就是前面說到的那種函數的地址,需要對這個地址做強制類型轉換為同類型的函數指針,才能正確賦值給p。
6. C語言——指向函數的指針
跟變數的指針差不多,沒什麼區別,變數可以做參數 ,函數也可以做參數.只要類型一樣就可以傳入.返回值 和 參數類型個數.函數也可以理解為一個變數來著,可以取得返回值作為函數的值.像這樣就可以在另一個函數裡面調用四種效果,雖然這樣寫也沒看到什麼比較方便的
7. C語言函數指針怎麼用
有函數: int fun(int a,int b);
要定義指向該函數的指針
對比指向 int a; 的指針
int *p; p = &a;
p的定義是怎麼來的?
首先要保證p是一個指針類型
寫下(*p),
然後,考慮下p的基類型,
p的基類型就是變數a的類型int
將int 放在(*p)前面就行了
int (*p);
括弧可以省略,就成了 int *p;
同理
想要實現 pf = &fun;
(*pf) 將pf定義為一個指針,
將fun的類型作為pf的基類型
fun相當於一個 int (int a,int b)類型的量
int (int a,int b) (*pf);
基類型中有圓括弧和中括弧要後移
int (*pf)(int a,int b) ;//括弧不能省略
pf = &fun;
調用時
(*pf)(3,4); pf(3,4)都可以
8. 在C語言中,指向函數的指針怎麼調用函數
1樓感覺對函數指針不是很了解,就不評論了. 2樓的基本還可以,但是int (*p)(),然後讓它指向max函數,一個包含兩個未知量的函數,這在後來的標准c裡面是不支持的好像. 3樓吧,那麼多*,感覺有點不大對. *是取內容,連著那麼* ,我沒試過,沒有多少意義至少.他11級了,應該也不會怎麼有錯,你可以試試(我不打算加那麼多*, 就不調試了).
程序裡面對函數的調用,就是通過函數的入口地址,然轉入函數. 這樣的話,函數指針的意義就明顯了.函數指針指向了函數的入口,即函數指針里是函數的入口地址. 指針不能指向函數這種說法肯定是不對的.話說回來,1樓的老兄可能看錯書了,或者記錯了.
類型匹配很重要,二樓的聲明和使用不一致,這在老版的編譯器里也是支持的.那時候ANSI標准還沒有制定出來.現在而言,這種定義應該不被支持了才是.
那個聲明應該如下:
int (*p)(int , int);
這樣才能指向
int name(int,int)型的函數.么有實驗過,但按這種寫法是不錯的肯定.
三樓那個********p,怎麼都覺得不對.