⑴ 編寫一個C語言函數,從一個字元串刪除所有的尾隨空格,使用指針編寫
指針數組:
一個數組,其每個元素都是指針
數組指針:一個指針,指向一個數組(一般把數組首地址賦給指針)
函數指針:一個指針,指向一個函數(一般把函數棧的首地址賦給指針)
指針函數:
一個函數,
返回值類型為指針
字元串指針:一個指針,指向一個字元串(一般是把字元串的首地址賦給指針)
告訴你理解的方法:
短語名詞中
第二個名詞是主體,前面的是修飾的。
⑵ C語言函數指針問題
事實上使用函數指針的時候
fun('a')
(*fun)('a')
(fun)('a')
效果都是一樣的。
fun和*fun的值也是一樣的。可能是為了c語言版本兼容性之類的原因(也許不同時期c語言規定函數指針的寫法不一樣吧,就如同早期版本函數傳參數的寫法是不一樣),編譯器進行了優化,都接受這些寫法罷了。
其實只需要知道,函數指針只是一個特殊的指針,這個指針指向的地址必須是函數的地址就可以了。不需要深究的。使用的時候,就當作函數,函數怎麼調用就怎麼用。所以我一般在用指針函數的時候都是
fun('a'),就把它當成函數,感覺這樣比較容易理解。
⑶ c語言函數用到指針的時候怎麼寫是傳入指針變數的值,怎麼寫是傳入指針指向的值
訪問指針變數的值:在變數名前面加*
int 到string無法賦值,因為類型不同。
轉義字元是在字元無法表示的情況下藉助字元中的字母前面加「\」來表示如回車符的轉義字元是'\n'。
⑷ C語言關於調用函數指針指向的函數的寫法。
不存在正規與不正規問題,但前一種寫法(a=ACC(22,33); )可讀性要更好一些。
⑸ C語言指針,這兩種寫法為什麼錯
swap(int
*pt1,int
*pt2)
{int
*temp;
temp=pt1;
pt1=pt2;
pt2=temp;
}
因為第二種的指針temp沒有初始化是不對的.
也就像樓上說的,它們只改地址的位置,不改變內容.可是,像我上面說的.最後沒有初始化temp也是種錯誤.
⑹ C語言指針寫法
問題1那樣寫是錯誤的。問題2那樣寫也是錯誤的,數據類型不匹配。
補充問題29是指針初始化的定義方式阿,p是指針類型,初始化時賦值就需要為選項D形式,若在初始化時未賦值,則可以寫成:
float *p;
int x=1;
p=&x;
形式。
⑺ C語言指針的用法
#include<stdio.h>
#include<math.h>
#include <conio.h>
void sort(char *a[],int n)
{
int i,j;
char *temp;
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
if(strcmp(a[i],a[j]<0))
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
int main()
{
char *a[3];
int i;
for(i=0;i<3;i++)
a[i] = (char *)malloc(sizeof(char));
for(i=0;i<3;i++)
scanf("%s",a[i]);
sort(a,3);
for(i=0;i<3;i++)
printf("%s\n",a[i]);
getch();
}
應該改成這樣
其中
char *temp;
temp=a[i];
a[i]=a[j];
a[j]=temp;
做了修改
原因如下:未修改前temp是一個字元變數,而*a[i]是指針a[i]所指向的內容,就把需要交換的字元串的首字元交換了。
你要交換的是指針或者說是地址,而不是指針里的內容。這就是問題所在。
在temp前加*就表示temp也是個指針,再把a[i]前的*去掉,就實現了交換指針地址的目的。
指針的聲明要加*例如
int *a;
使用的時候如果事指針操作則不要帶*例如
char *a = 「hank」;
a++;此時a指向的字元串就變成了「ank」
涉及到指針指向的內容的要加*例如
char b = *a;
指向數組的指針,例如
int b[10];
int *a = b;
a就是b[0]的地址*a就是b[0]的內容
a+1就是b[1]的地址依此類推
又如char *a = "hank";
那麼通過a就能得到整個字元串"hank"
*a是h
*(a+1)是a
...
STRCMP是c語言函數庫中的函數
雖然傳參傳的是指針,但是具體比較的時候比較的是裡面的內容。具體涉及到指向數組的指針的應用。因為c中沒有String類型,所以就只能使用char類型的指針來表示字元串。
⑻ C語言中的函數指針
函數指針是指向函數的指針變數。 因而「函數指針」本身首先應是指針變數,只不過該指針變數指向函數。這正如用指針變數可指向整型變數、字元型、數組一樣,這里是指向函數。
int func(int x); /* 聲明一個函數 */
int (*f) (int x); /* 聲明一個函數指針 */
f=func; /* 將func函數的首地址賦給指針f */
賦值時函數func不帶括弧,也不帶參數,由於func代表函數的首地址,因此經過賦值以後,指針f就指向函數func(x)的代碼的首地址。
注2:函數括弧中的形參可有可無,視情況而定。
下面的程序說明了函數指針調用函數的方法:
例一、
#include<stdio.h>
int max(int x,int y){ return(x>y?x:y); }
void main()
{
int (*ptr)(int, int);
int a,b,c;
ptr=max;
scanf("%d%d",&a,&b);
c=(*ptr)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
ptr是指向函數的指針變數,所以可把函數max()賦給ptr作為ptr的值,即把max()的入口地址賦給ptr,以後就可以用ptr來調用該函數,實際上ptr和max都指向同一個入口地址,不同就是ptr是一個指針變數,不像函數名稱那樣是死的,它可以指向任何函數,就看你想怎麼做了。在程序中把哪個函數的地址賦給它,它就指向哪個函數。而後用指針變數調用它,因此可以先後指向不同的函數。不過注意,指向函數的指針變數沒有++和--運算,用時要小心。
指針函數是指返回值是指針的函數,即本質是一個函數。我們知道函數都有返回類型(如果不返回值,則為無值型),只不過指針函數返回類型是某一類型的指針。
其定義格式如下所示:
返回類型標識符*返回名稱(形式參數表)
{ 函數體}
返回類型可以是任何基本類型和復合類型。返回指針的函數的用途十分廣泛。事實上,每一個函數,即使它不帶有返回某種類型的指針,它本身都有一個入口地址,該地址相當於一個指針。比如函數返回一個整型值,實際上也相當於返回一個指針變數的值,不過這時的變數是函數本身而已,而整個函數相當於一個「變數」。
其實還是指針,只是指向的內容和聲明方法不同而已
⑼ 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 列的值。讀者可仔細領會元素值的各種不同的表示方法。 應該注意指針數組和二維數組指針變數的區別。 這兩者雖然都可用來表示二維數組,但是其表示方法和意義是不同的
⑽ c語言 指向返回指針的函數的指針的寫法
你的陳述不太全,缺返回的指針指向的類型。寫法如下:
char *(*p)(int,int);//聲明p是指向一個具有兩個int型形參的函數,函數返回一個char *型指針。