指針與函數5883

指針與函數5883

來自專欄 C語言代碼精簡及分析

關於編程部分代碼題,閱讀他人代碼並理解其意圖是難點

#include <stdio.h>#include <stdlib.h>#include <string.h>void sort1(char **pp,int n){ //補充完成程序 //char temp[50]; char *ptemp;//①為什麼這個指針不用申請內存? int i,j; for(i=0;i<n-1;i++) for(j=1;j<n-i;j++) if(strcmp(pp[j-1],pp[j])>0) { //strcpy(temp,pp[j-1]); //strcpy(pp[j-1],pp[j]); //strcpy(pp[j],temp); //②為什麼注釋部分代碼是錯誤代碼?ps.我自己都沒有發現 ptemp=*(pp+j-1); *(pp+j-1)=*(pp+j); *(pp+j)=ptemp; }}void output1(char *p[],int n){ //補充完成程序 int i; for(i=0;i<n;i++) printf("%s
",p[i]);}int main(){ void sort1(char **pp,int n); void output1(char *p[],int n); char str[50],*cp[20]; int n,l,i; while(scanf("%d
",&n)!=EOF) { for(i=0;i<n;i++) { gets(str); //start //在此寫動態開闢並存儲程序 int len=strlen(str); cp[i]=(char*)malloc(sizeof(char)*(len+1)); //指針數組存儲字元串最大的優勢是可以根據字元串的長度申請內存 strcpy(cp[i],str); //end } sort1(cp,n); output1(cp,n); } return 0;}

①*ptemp在後續代碼中直接用指針為其賦值,即出現兩個指針共同指向同一個內存空間的情況,故*ptemp不賦初值也不是野指針.

②因為主函數中的指針數組是根據字元串的長度申請的,如果將banana複製到apple的內存,顯然出現溢出.故最終用指針之間的賦值避免溢出.

ps.注意代碼中while(scanf("%d
",&n)!=EOF),%d

起到getchar();的作用,因為緩存區中的
成功輸入會被釋放.而常規的while(scanf("%d",&n)!=EOF),
作為結束符而不是輸入的一部分故會留存在緩存區中.

推薦閱讀:

從C語言的函數傳參談指針
函數與指針(1)
Emacs之魂(五):變數的「指針」語義
從C語言的數組參數退化為指針談起

TAG:指針 | 函數 | 科技 |