下面是具體的三個問題,這次的問題稍微複雜了一點
1、 讀程序,寫出你的分析步驟,得出結果。
typedefint (*FUNC1)(int);
typedefint (*FUNC2)(int *, int *, int *);
intinc(int a)
{
return (++a);
}
int multi(int *a, int *b, int *c)
{
return (*c=*a**b);
}
void show(FUNC2 fun, int arg1, int *arg2)
{
FUNC1 p = inc;
int temp = p(arg1);
fun(&temp, &arg1, arg2);
printf("%d\n", *arg2);
}
主程序:int a = 0; show(multi, 10, &a);
2、閱讀一下程序,找出錯誤並更改。PS:以下代碼是把一個字符串倒序,如“abcd”倒序後變爲“dcba”
<所有頭文件都已包含>
main()
{
char*src="hello,world";
char* dest=NULL;
int len=sizeof(src);
dest=(char*)malloc(len);//這裏的這個長度爲len+1
char* s=src[len];
while(len--!=0)
dest++=s--;
printf("%s",dest);
return 0;
}
3、編寫一個函數,作用是把一個char組成的字符串循環右移n個。比如原來是“abcdefghi”如果n=2,移位後應該是“hiabcdefg”
//pStr是指向以''結尾的字符串的指針
//steps是要求移動的n
void LoopMove ( char * pStr, int steps )
{
//請填充...
}
解答:
(1):
對於第一個問題,最困難的地方在於它程序的前兩行,理解對於我們是非常困難的,但是,代入到具體的具體的show函數時,可以發現FUNC2它作爲一個形參,居然可以使用函數 multi的功能時,第一二行大概是函數的另類的聲明,所以,一切問題迎刃而解。所以對於FUNC1來說,它指向了inc類型的函數,於是FUNC1聲明的p就有了inc的功能。類似的FUNC2 聲明的fun有了multi的功能是相同的,所以,按照邏輯最後走下來,它的最後的結果爲110.
雖然很勉強,但是理解水平有限。
#include <stdio.h>
typedef int (*FUNC1)(int);// FUNC1是指向int (*)(int)的函數指針類型
typedef int (*FUNC2)(int *, int *, int *);//FUNC2是指向int (*)(int*,int*,int*)的函數指針類型
int inc(int a)
{
return (++a);
}
int multi(int *a, int *b, int *c)
{
return (*c=*a**b);
}
void show(FUNC2 fun, int arg1, int *arg2)
{
FUNC1 p = inc;//分析:調用show函數:1、temp=inc(10)也就是11.
//2、fun(&temp, &arg1, arg2) -> *arg2 = 10 * 11 = 110
//3、arg2是指針,作爲輸出型參數存在,所以將&a傳入後會影響變量a的原始值
int temp = p(arg1);
fun(&temp, &arg1, arg2);
printf("%d\n", *arg2);
}
int main(){
int a = 0;
show(multi, 10, &a);
}
(2):
對於第二個問題,由於平時所用的字符的操作完全就是用數組(雖然本質還是一個指向數組首地址的指針),本質上是懶的,所以還是想了一想。但是,紙上抄了一遍發現問題真的非常的致命!
對於程序來說,最怕的就是程序崩潰的問題,其次都是小case,但是這個題忽略了數組越界的問題,所以,在計算數組長度的時候,由於數組下標是從0開始的,所以最大的下標爲最大長度-1,然而,這個題忽略了這個問題,所以只需要程序就會正確吧。但是,實際運行的時候字符指針那裏顯示錯誤。還有申請空間的時候需要去 多申請一個存放字符串結束標誌的符號‘\0’,dest使用完畢後需要釋放dest所佔用的內存(c的編譯器在程序運行結束後不會對它進行處理,需要程序猿自己搞定)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char *src="hello,world";
char* dest=NULL;
int len=strlen(src);
dest=(char*)malloc(len+1);
char*p =dest;
char *s=&src[len-1];
while(len--!=0)
{
*p++=*s--;//字符串的倒置
}
*p='\0';
printf("%s",dest);//要用一個指針去記錄dest的初始位置,否則打印不了新的字符串
return 0;
}
(3):
對於第三個問題,還是自己慢慢寫下,因爲沒用過指針解決字符串的問題。很不幸的是,由於水平問題,只能是附上錯誤的代碼,因爲編譯器編譯以上題目,只有題1通過測試,字符的指針的都沒有通過。所以只能靠瞎蒙了。
先求出上述要移動 的字符串的長度,之後就是進入循環,循環次數爲移動的個數。(需要另外用一個指針保存字符串的首地址)。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void loop_move (char *p, int steps){
int i = 0, j = 0;
char s;
int len = strlen(p)-1;
for(i=0; i<steps; i++)
{
s = p[len];
for(j=len; j>0; j--)
{
p[j] = p[j-1];
}
p[0] = s;
}
}
int main(void)
{
int n;
char s[20];
gets(s);
scanf("%d",&n);
loop_move(s,n);
printf("%s", s);
return 0;
}