#include stdio.h
成都創新互聯專注于大洼網站建設服務及定制,我們擁有豐富的企業做網站經驗。 熱誠為您提供大洼營銷型網站建設,大洼網站制作、大洼網頁設計、大洼網站官網定制、微信平臺小程序開發服務,打造大洼網絡公司原創品牌,更為您提供大洼網站排名全網營銷落地服務。
void ToUpper(char *p);
int main(void)
{
char s[10];
printf("Please input a string:\n");
scanf("%s",s);//數組名就是數組地址,不用加取址符
ToUpper(s);//自定義函數,在主函數中被調用時,不用加類型
printf("The new string is %s\n",s);
return 0;
}
void ToUpper(char *p)
{
for(;*p!='\0';p++)//這里的 *p=0刪掉,*p=0等價于*p=NULL;也就是說你把指針p變成空指針了,沒有指向了
{
if(*p='a'*p='z')//這里少個指針符
*p=*p-'a'+'A';
}
}
1樓感覺對函數指針不是很了解,就不評論了. 2樓的基本還可以,但是int (*p)(),然后讓它指向max函數,一個包含兩個未知量的函數,這在后來的標準c里面是不支持的好像. 3樓吧,那么多*,感覺有點不大對. *是取內容,連著那么* ,我沒試過,沒有多少意義至少.他11級了,應該也不會怎么有錯,你可以試試(我不打算加那么多*, 就不調試了).
程序里面對函數的調用,就是通過函數的入口地址,然轉入函數. 這樣的話,函數指針的意義就明顯了.函數指針指向了函數的入口,即函數指針里是函數的入口地址. 指針不能指向函數這種說法肯定是不對的.話說回來,1樓的老兄可能看錯書了,或者記錯了.
類型匹配很重要,二樓的聲明和使用不一致,這在老版的編譯器里也是支持的.那時候ANSI標準還沒有制定出來.現在而言,這種定義應該不被支持了才是.
那個聲明應該如下:
int (*p)(int , int);
這樣才能指向
int name(int,int)型的函數.么有實驗過,但按這種寫法是不錯的肯定.
三樓那個********p,怎么都覺得不對.
我不清楚你的疑問到底指哪些。我就你寫的這些代碼解讀:
int read_column_numbers(int columns[], int max)函數功能:
傳參數組首地址,及數組最大長度。
用戶輸入max個整數,只保存其中的正整數(負數忽略),如果正整數的個數是偶數則返回個數。否則程序結束。
void rearrange(char *output,char const *input,int n_columns, int const columns[])函數功能:
傳參 數組output首地址 , 數組input首地址 ,用戶輸入正整數個數,正整數數組
迭代數組,根據用戶的輸入的數字作為input起始下標,復制并拼接到數組output中(具體邏輯我不研究了)。
strncpy(output + output_col,input + columns[col],nchars)這里就是就是拼接復制,變量output_col記錄的是output 已保存字符長度,output + output_col就是每次接在已有字符后面放復制的字符。input + columns[col]是用戶輸入的數字作為起始位置的偏移量取nchars個字符復制到output 中。
總結:
一、
首先數組名作為參數傳遞,無論形參定義是指針還是數組(int *columns 和 int columns[ ]效果是一樣的),最終都是傳地址。
二、
數組形參定義char const *,修飾符const表示常量不可修改,這里const修飾的是*input,表示數組指針指向的地址內容不能修改,但是數組指針本身值可以修改。也就是說函數中可以改變input指向的地址(比如input++),但是不能改變其指向的值(比如input[0]='A')。
void CallMyFun(FunType fp,int x);是一個包含函數指針的函數!
fp只是函數指針的名稱,是 CallMyFun函數的形參,這個名稱你可以隨便取的
當調用CallMyFun(MyFun1,10);//假設調用此變量時,
fp指代的就是MyFun1函數,而MyFun1的參數哪里來?就是通過CallMyFun的第2個參數傳遞進來的,這里是10
所以運行CallMyFun(MyFun1,10);函數,其實就是運行了call MyFun1(10)
所以運行CallMyFun(MyFun2,20);函數,其實就是運行了call MyFun2(20)
所以fp(x)指代的是一個函數,如果要輸出他的結果,那在定義MyFun1,MyFun2時,函數就需要有返回值,而不能用void
#include?stdio.h
#include?stdlib.h
int?ave(int?n,int?*a);
int?main()
{
int?i,n,*a;
printf("please?input?number?n:");
scanf("%d",n);
a=(int?*)?malloc(n*sizeof(int));
printf("please?input?%d?numbers:\n",n);
for(i=0;in;i++)
scanf("%d",a+i);
printf("The?average?number?is?%d\n",ave(n,a));
}
int?ave(int?n,int?*a)
{
int?i,sum=0;
for(i=0;in;i++)
sum+=*(a+i);
return?sum/n;
}
第一條紅線是定義一個函數指針;
第二條紅線起強轉作用,把0xd010f0強轉為對應的函數指針類型
我寫的這個程序可以幫你理解...常量地址被printab取代~
網頁名稱:C語言指針調用類的函數 c語言如何用指針調用函數
文章起源:http://m.kartarina.com/article32/hgpopc.html
成都網站建設公司_創新互聯,為您提供App開發、微信小程序、搜索引擎優化、軟件開發、微信公眾號、網站設計
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯