#include stdio.h
成都創(chuàng)新互聯(lián)專注于大洼網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供大洼營(yíng)銷型網(wǎng)站建設(shè),大洼網(wǎng)站制作、大洼網(wǎng)頁(yè)設(shè)計(jì)、大洼網(wǎng)站官網(wǎng)定制、微信平臺(tái)小程序開(kāi)發(fā)服務(wù),打造大洼網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供大洼網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
void ToUpper(char *p);
int main(void)
{
char s[10];
printf("Please input a string:\n");
scanf("%s",s);//數(shù)組名就是數(shù)組地址,不用加取址符
ToUpper(s);//自定義函數(shù),在主函數(shù)中被調(diào)用時(shí),不用加類型
printf("The new string is %s\n",s);
return 0;
}
void ToUpper(char *p)
{
for(;*p!='\0';p++)//這里的 *p=0刪掉,*p=0等價(jià)于*p=NULL;也就是說(shuō)你把指針p變成空指針了,沒(méi)有指向了
{
if(*p='a'*p='z')//這里少個(gè)指針?lè)?/p>
*p=*p-'a'+'A';
}
}
1樓感覺(jué)對(duì)函數(shù)指針不是很了解,就不評(píng)論了. 2樓的基本還可以,但是int (*p)(),然后讓它指向max函數(shù),一個(gè)包含兩個(gè)未知量的函數(shù),這在后來(lái)的標(biāo)準(zhǔn)c里面是不支持的好像. 3樓吧,那么多*,感覺(jué)有點(diǎn)不大對(duì). *是取內(nèi)容,連著那么* ,我沒(méi)試過(guò),沒(méi)有多少意義至少.他11級(jí)了,應(yīng)該也不會(huì)怎么有錯(cuò),你可以試試(我不打算加那么多*, 就不調(diào)試了).
程序里面對(duì)函數(shù)的調(diào)用,就是通過(guò)函數(shù)的入口地址,然轉(zhuǎn)入函數(shù). 這樣的話,函數(shù)指針的意義就明顯了.函數(shù)指針指向了函數(shù)的入口,即函數(shù)指針里是函數(shù)的入口地址. 指針不能指向函數(shù)這種說(shuō)法肯定是不對(duì)的.話說(shuō)回來(lái),1樓的老兄可能看錯(cuò)書了,或者記錯(cuò)了.
類型匹配很重要,二樓的聲明和使用不一致,這在老版的編譯器里也是支持的.那時(shí)候ANSI標(biāo)準(zhǔn)還沒(méi)有制定出來(lái).現(xiàn)在而言,這種定義應(yīng)該不被支持了才是.
那個(gè)聲明應(yīng)該如下:
int (*p)(int , int);
這樣才能指向
int name(int,int)型的函數(shù).么有實(shí)驗(yàn)過(guò),但按這種寫法是不錯(cuò)的肯定.
三樓那個(gè)********p,怎么都覺(jué)得不對(duì).
我不清楚你的疑問(wèn)到底指哪些。我就你寫的這些代碼解讀:
int read_column_numbers(int columns[], int max)函數(shù)功能:
傳參數(shù)組首地址,及數(shù)組最大長(zhǎng)度。
用戶輸入max個(gè)整數(shù),只保存其中的正整數(shù)(負(fù)數(shù)忽略),如果正整數(shù)的個(gè)數(shù)是偶數(shù)則返回個(gè)數(shù)。否則程序結(jié)束。
void rearrange(char *output,char const *input,int n_columns, int const columns[])函數(shù)功能:
傳參 數(shù)組output首地址 , 數(shù)組input首地址 ,用戶輸入正整數(shù)個(gè)數(shù),正整數(shù)數(shù)組
迭代數(shù)組,根據(jù)用戶的輸入的數(shù)字作為input起始下標(biāo),復(fù)制并拼接到數(shù)組output中(具體邏輯我不研究了)。
strncpy(output + output_col,input + columns[col],nchars)這里就是就是拼接復(fù)制,變量output_col記錄的是output 已保存字符長(zhǎng)度,output + output_col就是每次接在已有字符后面放復(fù)制的字符。input + columns[col]是用戶輸入的數(shù)字作為起始位置的偏移量取nchars個(gè)字符復(fù)制到output 中。
總結(jié):
一、
首先數(shù)組名作為參數(shù)傳遞,無(wú)論形參定義是指針還是數(shù)組(int *columns 和 int columns[ ]效果是一樣的),最終都是傳地址。
二、
數(shù)組形參定義char const *,修飾符const表示常量不可修改,這里const修飾的是*input,表示數(shù)組指針指向的地址內(nèi)容不能修改,但是數(shù)組指針本身值可以修改。也就是說(shuō)函數(shù)中可以改變input指向的地址(比如input++),但是不能改變其指向的值(比如input[0]='A')。
void CallMyFun(FunType fp,int x);是一個(gè)包含函數(shù)指針的函數(shù)!
fp只是函數(shù)指針的名稱,是 CallMyFun函數(shù)的形參,這個(gè)名稱你可以隨便取的
當(dāng)調(diào)用CallMyFun(MyFun1,10);//假設(shè)調(diào)用此變量時(shí),
fp指代的就是MyFun1函數(shù),而MyFun1的參數(shù)哪里來(lái)?就是通過(guò)CallMyFun的第2個(gè)參數(shù)傳遞進(jìn)來(lái)的,這里是10
所以運(yùn)行CallMyFun(MyFun1,10);函數(shù),其實(shí)就是運(yùn)行了call MyFun1(10)
所以運(yùn)行CallMyFun(MyFun2,20);函數(shù),其實(shí)就是運(yùn)行了call MyFun2(20)
所以fp(x)指代的是一個(gè)函數(shù),如果要輸出他的結(jié)果,那在定義MyFun1,MyFun2時(shí),函數(shù)就需要有返回值,而不能用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;
}
第一條紅線是定義一個(gè)函數(shù)指針;
第二條紅線起強(qiáng)轉(zhuǎn)作用,把0xd010f0強(qiáng)轉(zhuǎn)為對(duì)應(yīng)的函數(shù)指針類型
我寫的這個(gè)程序可以幫你理解...常量地址被printab取代~