創客學院9天C語言六
阿新 • • 發佈:2018-11-23
①陣列在函式間傳參:
全域性陣列傳遞方式:
複製傳遞方式:
實參為陣列的指標,形參為陣列名(本質是一個指標變數)
地址傳遞方式:
實參為陣列的指標,形參是同類型的指標
▲編寫一個函式,計算一個一維整形陣列的所有元素的和。
傳元素和個數;
int array_sum (int data[],int n);//int *data代替int data[] int main (int argc,char *argv[]) { int a[] = {5,3,9,21,4}; int sum = 0; sum = array_sum(a,sizeof(data)/sizeof(int)); printf ("sum=%d\n",sum); return 0; } int array_sum (int data[],int n)//int data[] = a;error int *data =a; { int ret = 0; int i; //n = sizeof(data)/sizeof(int); for (i = 0;i<n;i++) { printf("%d\n",data[i]); ret += data[i]; } return ret; }
②編寫函式,刪除字串中的空格。
#include <stdio.h> void del_space(char * s1); int main (int argc,char *argv[]) { char s[] = " h a sdf g "; puts(s); del_space(s); puts(s); return 0; } void del_space(char * s1) { char * s2; s2 = s1; while (*s1) { if (*s1 == ' ') { s1++; } else { *s2 = *s1; s1++; s2++; } } *s2 = '\0'; }
③指標函式:一個函式的返回值為地址量的函式
<資料型別> * <函式名稱> (<引數說明>)
{語句序列;}
返回值:全域性變數的地址、static變數的地址、字串常量的地址
▲錯誤:
#include <stdio.h> #include <string.h> char * getstring(); int main (int argc,char *[]) { printf (---%s---\n",getstring()); return 0; } char * getstring () { char str[20]; strcpy(str,"hello"); return str; }
▲改正:
#include <stdio.h>
#include <string.h>
int main (int argc,char * argv[])
{
char * r;
r = getstring();
printf("---%s---\n",getstring());
(*r)++;
puts(r);
return 0;
}
char * getstring()
{
static char str[20];
strcpy(str,"hello");
return str;
}
▲改正2:
int main (int argc,char *argv[])
{
char * r = "hello";
r = getstring();
printf("---%s---\n",getstring());
puts(r);
return 0;
}
char * getstring()
{
char * str = "hello";
}
④編寫一個指標函式,刪除字串中的空格
#include <stdio.h>
#include <string.h>
char * del_space(char * s);
int main (int argc,char *argv[])
{
char * r;
char str[] = " how are you ";
r = del_space(str);
printf("---%s---\n",r);
puts(str);
return 0;
}
char * del_space(char * s)
{
char * r = s;
char * p = s;
while (*s)
{
if(*s == ' ')
s++;
else
{
*p = *s;
s++;
p++;
}
}
*p = '\0';
return r;
}
⑤字串拷貝的功能
#include <stdio.h>
#include <string.h>
char * del_space (char * s);
int main (int argc,char *argv[])
{
char str[]= " how are you";
char s[50],s2[50];
//strcpy(s,del_space(str));
strcpy(s2,strcpy(s,del_space(str)));
puts(str);
puts(s);
puts(s2);
return 0;
}
char * del_space (char * s)
{
char * r=s;
char * p=s;
while (*s)
{
if(*s == ' ')
s++;
else
{
*p = *s;
s++;
p++;
}
}
*p = '\0';
return r;
}
}
⑥編寫一個指標函式,連線字串
#include <stdio.h>
//#include <string.h>
int main (int argc,char *[])
{
char dest[50] = "welcome";
char src[] = "makeru";
puts(mastrcat(dest,src));
puts(dest);
return 0;
}
char *mstrcat(char *dest ,const char * src)
{
char * r = dest;
while (*dest)
{
dest++;
}
while (*src)
{
*dest = *src;
dest ++;
src ++;
}
*dest = '\0';
return r;
}
簡潔版:
char *mstrcat(char * dest, const char *src)
{
char * r = dest;
while (*dest++);
dest --;
while (*dest ++ = *src++);
return r;
}
⑦指標函式輸入數字轉為字元
#include <stdio.h>
char *itoa(int n);
int main (int argc,char *argv[])
{
int n;
char * s;
printf("input:");
scanf ("%d",&n);
s = itoa(n);
puts(s);
return 0;
}
char * itoa (int n)
{
int r,i=0;
static char p[50];
while (n)
{
r = n % 10;
n /= 10;
p[i] = r + '0';
i++;
}
p[i] = '\0';
j = i-1;
i = 0;
while (i<j)
{
r = p[i];
p[i] = p[j];
p[j] = r;
i++;
j--;
}
return p;
}
⑧
#include <stdio.h>
char *itoa(char * p,int n);
int main (int argc,char *argv[])
{
int n;
char s[50],* r;
printf("input:");
scanf ("%d",&n);
r = itoa(n);
puts(r);
puts(s);
return 0;
}
char * itoa (char *p,int n)
{
int r,i=0,j;
//static char p[50];
while (n)
{
r = n % 10;
n /= 10;
p[i] = r + '0';
i++;
}
p[i] = '\0';
j = i-1;
i = 0;
while (i<j)
{
r = p[i];
p[i] = p[j];
p[j] = r;
i++;
j--;
}
return p;
}
⑨遞迴函式
遞迴函式是指一個函式的函式體中直接或間接呼叫了該函式自身
遞迴函式呼叫的執行過程分為兩個階段:
遞推階段:從原問題出發,按遞迴公式遞推從未知到已知,最終
達到遞迴終止條件
迴歸階段:按遞迴終止條件求出結果,逆向逐步代入遞迴公式,迴歸到
原問題求解;
#include <stdio.h>
int fac(int);
int main (int argc,char *argv[])
{
int n;
printf("input:");
scanf("%d",&n);
printf("%d\n",fac(n));
return 0;
}
int fac(int n)
{
if (n == 0 || n ==1)
return 1;
return n * fac(n-1);
}
菲波那切數列
#include <stdio.h>
int fib(int);
int main ()
{
int n = 1;
while (n <=10)
{
printf("%d ",fib(n));
n++;
}
printf ("\n");
return 0;
}
int fib (int n)
{
if (n ==1 || n ==2)
return 1;
return fib(n-1)+fib(n-2);
}
函式指標:
函式指標用來存放函式的地址,這個地址是一個函式的入口地址
函式名代表了函式的入口地址;
#include <stdio.h>
int add (int a,int b)
{
return a + b;
}
int main(int argc,char *argv[])
{
int m = 10,n = 20;
p = add;
printf ("%d\n",(*p)(m,n));
return 0;
}
返回一個比較長的字串:
#include <stdio.h>
#include <string.h>
char *strlong(char *str1, char *str2){
if(strlen(str1) >= strlen(str2)){
return str1;
}else{
return str2;
}
}
int main(){
char str1[30], str2[30], *str;
gets(str1);
gets(str2);
str = strlong(str1, str2);
printf("Longer string: %s\n", str);
return 0;
}
用指標作為函式返回值時需要注意的一點是,函式執行結束後會銷燬在它內部定義的所有區域性資料,包括區域性變數、區域性陣列和形式引數,函式返回的指標請儘量不要指向這些資料,C語言沒有任何機制來保證這些資料會一直有效,它們在後續使用過程中可能會引發執行時錯誤。