用來演示指向函數的指針。
// 自增函數:將數值a加1並返回結果
int inc(int a)
{
return(++a);
}
// 乘法函數:用來將a,b兩指針指向的數值相乘,並將結果存於c指針指向的空間
int multi(int*a,int*b,int*c)
{
return(*c=*a**b);
}
typedef int(FUNC1)(int in); //定義一個指定參數類型的函數指針類型FUNC1
typedef int(FUNC2) (int*,int*,int*); // 定義三個指定參數類型的函數指針類型FUNC2
void show(FUNC2 fun,int arg1, int*arg2)
{
FINC1 p=&inc; // 定義指向1個參數的函數指針p,並指向自增函數inc
int temp =p(arg1); // 調用處增函數p將arg1數值自增,並把結果存於temp,爲10+1=11
fun(&temp,&arg1, arg2); // 調用傳入的函數指針(實爲multi),將temp,arg1數值相乘,結果存於arg2指向的空間,爲10*11=110
printf("%d\n",*arg2); // 打印乘法結果110
}
main()
{
int a; // 定義變量a用於存儲結果
show(multi,10,&a); // 調用函數show並傳入三個參數:函數指針multi, 數值10,結果變量a的地址
return 0;
}
請找出下面代碼中的全部錯誤 (題目不錯,值得一看)
說明:如下代碼是把一個字符串倒序,如「abcd」倒序後變爲「dcba」 #include"string.h" main() {
char*src="hello,world"; char* dest=NULL; int len=strlen(src);
dest=(char*)malloc(len); char* d=dest; char* s=src[len]; while(len--!=0) d++=s--;
printf("%s",dest); return 0; } 答:
方法1:一共有4個錯誤; int main() {
char* src = "hello,world"; int len = strlen(src);
char* dest = (char*)malloc(len+1);//要爲分配一個空間 char* d = dest; char* s = &src[len-1]; //指向最後一個字符 while( len-- != 0 ) *d++=*s--;
*d = 0; //尾部要加’\0’ printf("%sn",dest);
free(dest); // 使用完,應當釋放空間,以避免形成內存匯泄露 dest = NULL; //防止產生野指針 return 0; }
方法2: (方法一須要額外的存儲空間,效率不高.) 不錯的想法 #include <stdio.h> #include <string.h> main()數組
{
char str[]="hello,world"; int len=strlen(str); char t;
for(int i=0; i<len/2; i++) { t=str;
str=str[len-i-1]; //當心一點 str[len-i-1]=t; }
printf("%s",str); return 0; } 函數
(a++)*(a++) 禁止這樣寫spa