C-函數的由淺入深

1.函數的定義
數據類型 函數名 (【數據類型 形參名,數據類型 形參名, …】)
2.函數的傳參
值傳遞
地址傳遞
全局變量
3.函數的調用
嵌套調用
遞歸
4.函數與數組
5.函數與指針
指針函數
函數指針
函數指針數組

函數的定義

#include<stdio.h>
#include<stdlib.h>int main(int argc,char *argv[])
//argc 是計算一共傳遞參數的個數
//argv 字符指針數組的首地址   輸入參數都會保存在這個字符數組里面,最后一個元素是NULL (存放char * 類型的數組)
{printf("argc = %d\n",argc);//for(i = 0;i<argc;i++)for(i = 0;argc[i] != NULL;i++)//等價于上述表達式puts(argv[i]);printf("hello!\n");//返回值 長度7return 0;//當沒有返回值時,默認返回最后一條語句的返回值
}
#include<stdio.h>
#include<stdlib.h>
/*
void print_value(void)
{printf("hello world!\n");return ;
}int main()
{print_value();return 0;
}
*/
void print_value(void);
int main()
{print_value();return 0;
}
void print_value(void)
{printf("hello world!\n");return ;
}
//main函數是主調函數,其它被調函數需要寫在主調函數上方實現,或者在上方聲明才能在下方實現

一個進程的返回狀態是給他的父進程看的

值傳遞

#include<stdio.h>
#include<stdlib.h>int print_value(int a,int b)
{printf("%d %d\n",a,b);return 0;
}int main()
{int i=3, j=5;print_value(i,j);return 0;
}

地址傳遞 (間接引用)

#include<stdio.h>
#include<stdlib.h>void swap(int *p,int *q)
{int tmp;tmp =*p;*p = *q;*q = tmp;
}int main()
{int i=3, j=5;swap(&i,&j);printf("i = %d,j = %d\n",i,j);return 0;
}

嵌套調用

#include<stdio.h>
#include<stdlib.h>max(int a,int b,int c)
{int tmp;tmp = a > b ? a : b;return tmp > c ? tmp : c;
}
min(int a, int b,int c)
{int tmp;tmp = a < b ? a : b;return tmp < c ? tmp : c;
}
dist(int a,int b,int c)
{return max(a,b,c) - min(a,b,c);
}
int main()
{int a=3,b=5,c=10;int res;res =  dist(a,b,c)printf("res = %d\n",res);return 0;
}

遞歸 一個函數嵌套的調用自己

#include<stdio.h>
#include<stdlib.h>void c(void)
{printf("[%s]begin!\n",__FUNCTION__);printf("[%s]end!\n",__FUNCTION__);
}
void b(void)
{printf("[%s]begin!\n",__FUNCTION__);printf("[%s]call c()!\n",__FUNCTION__);c();printf("[%s]c() returned!\n",__FUNCTION__);printf("[%s]end!\n",__FUNCTION__);
}
void a(void)
{printf("[%s]begin!\n",__FUNCTION__);printf("[%s]call b()!\n",__FUNCTION__);b();printf("[%s]b() returned!\n",__FUNCTION__);printf("[%s]end!\n",__FUNCTION__);
}
int main()
{printf("[%s]begin!\n",__FUNCTION__);printf("[%s]call a()!\n",__FUNCTION__);a();printf("[%s]a() returned!\n",__FUNCTION__);printf("[%s]end!\n",__FUNCTION__);return 0;
}
[main]begin!
[main]call a()!
[a]begin!
[a]call b()!
[b]begin!
[b]call c()!
[c]begin!
[c]end!
[b]c() returned!
[b]end!
[a]b() returned!
[a]end!
[main]a() returned!
[main]end!

遞歸解決階乘和斐波那契數列
遞歸 能夠抽象出來一個類似公式的遞推
漢諾塔 / 二叉樹 /階乘 /斐波那契數列

#include<stdio.h>
#include<stdlib.h>int func(int n)
{if(n<0)return -1;if(n == 0 || n ==1)return 1;return n * func(n-1);//一層一層的壓棧 出棧
}int main()
{int n;int res;scanf("%d",&n);res = func(n);printf("%d! = %d\n",n,res);return 0;
}
#include<stdio.h>
#include<stdlib.h>int fib(int n)
{if(n<1)return -1;if(n ==1 ||n ==2)//已知條件return 1;return fib(n-1) + fib(n-2);//公式
}int main()
{int n;int res;scanf("%d",&n);	res = fib(n);printf("fib[%d] = %d\n",n,res);return 0;
}

函數與一維數組

#include<stdio.h>
#include<stdlib.h>
/*
int a[N] = {1,2,3,4,5,6};
int *p = a;//一維數組 a和p除了一個常量一個變量 其他等價
傳參形式--->a   		*a  		 a[0] 		 &a[3] 		 p[i] 		 p		  *p 		 p+1*(a+0)
函數形參-->int *     int 		 int 		int * 		 int		 int * 	  int 		 int *
*//*方法一
void print_arr(int *p,int n)
{int i;printf("%s:%d\n",__FUNCTION__,sizeof(p));  for(i =0;i < n;i++)printf("%d ",*(p+i));printf("\n");
}
*/
void print_arr(int p[],int n)//int p[] 形參和定義的時候是不一樣的  可以理解一個 [] 等價于一個 *
{int i;printf("%s:%d\n",__FUNCTION__,sizeof(p));  for(i =0;i < n;i++)printf("%d ",*(p+i));printf("\n");
}
void func(int *p,int n)
{int i = 0,m,j,tmp;m = (n-1)/2;for(; i<= m;i++){j = n-1-i;tmp = p[i];p[i] = p[j];p[j] = tmp;}}int main(int argc,char **argv)
//int main(int argc,char *argv[])
{int a[] = {1,3,5,7,9};printf("%s:%d\n",__FUNCTION__,sizeof(a));print_arr(a,sizeof(a)/sizeof(*a));//一維數組傳參是傳遞了數組的起始位置,因此還需要告訴數組的長度func(a,sizeof(a)/sizeof(*a));//逆序數組print_arr(a,sizeof(a)/sizeof(*a));return 0;
}

函數和二維數組

#include<stdio.h>
#include<stdlib.h>
#define M 3
#define N 4
/*
int a[M][N]= {...};
int *p = *a;
int (*q)[N] = a;//數組指針  指向數組的指針  q 也可以稱行指針main傳參	  -->  a[i][j]    *(a+i)+j		a[i]+j		p[i] 		*p		q[i][j]		*q 			q 				P+3		q+2*(q+0)函數定義形參接收-->  int 	  int *			int *		int			int		int 		int *		int (*)[N]		int *		int (*)[N]	
*/void print_arr(int *p,int n)
{int i;for(i =0;i<n;i++){printf(%4d ",p[i]);//此時,把二維數組當成大的一維數組}printf("\n");
}void print_arr1(int (*p)[N],int m,int n)
//void print_arr1(int p[][N],int m,int n)
{int i,j;printf("sizeof(p) = %d\n",sizeof(p));//8for(i =0;i<m;i++){for(j = 0;j<n;j++)printf("%4d ",*(*(p+i)+j));//printf("%4d ",p[i][j]);printf("\n")}
}float average_score(int *p,int n)
{int i;float sum =0;for(i = 0;i<n;i++)sum += p[i];return sum/n;
}void find_num(int (*p)[N],int num)
{int i;for(i = 0;i < N; i++)printf("",*(*(p+num)+i));printf("\n");
}int main()
{int a[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12};print_arr(*a,M*N);//print_arr(&a[0][0],M*N); //*a  a[0]  *(a+0)  行指針轉換成列指針printf("sizeof(a) = %d\n",sizeof(a));//48print_arr1(a,M,N);//同樣需要傳遞行列數float ave;ave = average_score(*a,M*N);//此時,需求 不需要區分行列 所以按照一個大的一維數組處理printf("ave = %f ",ave);int num = 0;find_num(a,num);return 0;
}

函數與字符數組

#include<stdio.h>
#include<stdlib.h>char *mystrcpy(char *dest,const char *src)
{	char *ret = dest;if(dest! = NULL && src != NULL)while((*dest++ = *src++) != '\0');return ret;
}
char *mystrncpy(char *dest,const char *src,size_t n)
{	int i;for(i = 0;i < n && (dest[i] = src[i]); i++);for(;i <n;i++)dest[i] = '\0';return dest;
}int main()
{char str1[]="helloworld";char str2[128];mystrcpy(str2,str1);mystrncpy(str2,str1,5);puts(str2);return 0;
}

函數與指針關系的詳細剖析

指針函數:一個函數的返回值是指針
返回值 * 函數名(形參)
如:int *fun(int);

#if 0
void find_num(int (*p)[N],int num)
{int i;for(i = 0;i < N; i++)printf("",*(*(p+num)+i));printf("\n");
}
#endif
int *find_num(int (*p)[N],int num)//函數的功能越簡單越好 和其他函數減少依賴關系
{if(num > M-1)return NULL;return *(p + num);
}

函數指針:指向函數的指針 指向和函數指針相同類型的函數
類型 (*指針名)(形參)
如:int (*p)(int);

#include<stdio.h>
#include<stdlib.h>int add(int a, int b)//函數名是一段代碼所關聯的入口地址
{return a+ b;
}
int sub(int a,in b)
{return a-b;
}int main()
{int a = 3, b = 5;int ret;int (*p)(int,int);//別忘記括號   指向函數的指針 指向和函數指針相同類型的函數  并通過指針調用函數int (*q)(int,int);//int (int,int) (*q)p = add;q = sub;//ret = add(a,b);ret = p(a,b);printf("%d\n",ret);return 0;
}

函數指針數組:
類型 (*數組名【下標】) (形參)
如:int (*arr[N])(int); 數組中的N個元素 都是指向函數的指針

#include<stdio.h>
#include<stdlib.h>int add(int a, int b)//函數名是一段代碼所關聯的入口地址
{return a+ b;
}
int sub(int a,in b)
{return a-b;
}int main()
{int a = 3, b = 5,i;int ret;//int (*p)(int,int);//int (*q)(int,int);int (*funcp[2])(int,int);// int (int,int)  *funcp[2];//p = add;//q = sub;funcp[0] = add;funcp[1] =sub;//ret = add(a,b);//ret = p(a,b);for(i = 0;i<2;i++){ret = funcp[i](a,b);printf("%d\n",ret);}//printf("%d\n",ret);return 0;
}

p59反復看

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12946.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12946.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12946.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

醉了,面個功能測試,還問我Python裝飾器

Python 裝飾器是個強大的工具&#xff0c;可幫你生成整潔、可重用和可維護的代碼。某種意義上說&#xff0c;會不會用裝飾器是區分新手和老鳥的重要標志。如果你不熟悉裝飾器&#xff0c;你可以將它們視為將函數作為輸入并在不改變其主要用途的情況下擴展其功能的函數。裝飾器可…

dhcp(接口和全局地址池模式)

接口地址池和全局地址池 dhcp應用 1.全部開啟dhcp功能 2.ar5 0口接口地址池 1口全局地址池 3.ar6和ar7配置&#xff0c;查看能否自動獲取ip 左右不同兩個網絡&#xff0c;接口和全局地址池的區別 部分截圖 ar6 ar7 ar5

(實測驗證)【移遠EC800M-CN 】TCP 透傳

引言 本文章使用自研“超小體積TTL轉4GGPS集成模塊”進行實測驗證&#xff1b; 1、配置移遠EC800M-CN TCP 透傳 串口助手發送&#xff1a; ATQIOPEN1,0,"TCP","36.137.226.30",39755,0,2 //配置服務器地址和端口號&#xff1b; 4G模組返回…

07-Fortran基礎--Fortran指針(Pointer)的使用

07-Fortran基礎--Fortran指針Pointer的使用 0 引言1 指針&#xff08;Poionter&#xff09;的有關內容1.1 一般類型指針1.2 數組指針1.3 派生類(type)指針1.4 函數指針 2 可運行code 0 引言 Fortran是一種廣泛使用的編程語言&#xff0c;特別適合科學計算和數值分析。Fortran 9…

java代碼混淆工具ProGuard混淆插件

java代碼混淆工具ProGuard混淆插件 介紹 ProGuard是一個純java編寫的混淆工具&#xff0c;有客戶端跟jar包兩種使用方式。可以將程序打包為jar&#xff0c;然后用工具進行混淆&#xff0c;也可以在maven中導入ProGuard的插件&#xff0c;對代碼進行混淆。 大家都知道 java代…

【華為OD機試-C卷D卷-200分】田忌賽馬(C++/Java/Python)

【華為OD機試】-(A卷+B卷+C卷+D卷)-2024真題合集目錄 【華為OD機試】-(C卷+D卷)-2024最新真題目錄 題目描述 給定兩個只包含數字的數組a,b,調整數組 a 里面的數字的順序,使得盡可能多的a[i] > b[i]。 數組a和b中的數字各不相同。 輸出所有可以達到最優結果的a數組的…

SadTalker 自定義容器化部署配置

Docker 環境檢查 執行docker info 查看環境種是否有安裝docker&#xff0c;否則首先安裝好docker 運行環境。在線環境安裝執行執行兩條指令即可 sudo apt install docker sudo apt-get install docker-ce sudo apt-get install docker-composesudo systemctl restart dockerG…

langchain源碼

itemgetter&#xff1a;返回一個函數&#xff0c;函數取輸入dict的某個指定key Runnable 的基本方法有 invoke、 batch、 await、 ainvoke、 abatch 同步轉異步 Runnable 還具有的方法&#xff1a;bind、 with_config。 input_schema 屬性、output_schema 屬性 with_retry方…

Uniapp H5開發常見問題解析

引言 在移動應用開發領域&#xff0c;Uniapp已經成為一個備受矚目的技術框架&#xff0c;其跨平臺能力和高效開發特性使得開發者能夠更加便捷地構建出功能豐富、性能優越的應用程序。特別是在H5開發中&#xff0c;Uniapp的應用場景日益廣泛&#xff0c;然而&#xff0c;隨之而…

Vue2之使用provide和inject實現兩個不相干組件之間的通信

Vue2之使用provide和inject實現兩個不相干組件之間的通信 文章目錄 Vue2之使用provide和inject實現兩個不相干組件之間的通信1. 祖先組件中使用provide提供數據2.后代組件A中使用inject注入并使用數據3.后代組件B中使用inject注入并使用數據 在Vue 2中以使用provide和inject來實…

[ciscn 2022 東北賽區]math

1.題目 import gmpy2 from Crypto.Util.number import * from flag import flag assert flag.startswith(b"flag{") assert flag.endswith(b"}") messagebytes_to_long(flag) def keygen(nbit, dbit):if 2*dbit < nbit:while True:a1 getRandomNBitIn…

編輯器目錄樹的設計,一點也不簡單

朋友們好&#xff0c;我是優秀的大鵬 今天花了很長時間思考一個網頁文檔編輯器&#xff0c;云端目錄樹要怎么設計 這個看似簡單的需求&#xff0c;技術上和產品上的思考卻非常復雜 下面以幾種編輯器為例&#xff0c;講一下各種編輯器在技術上和產品的思考 1、以Vscode為代表的本…

Delphi DataSet轉JSon (使用SuperObject)

Delphi中將TDataSet轉換為JSon字符串。 with ATM.LoadDataSet() dobeginif IsEmpty thenbeginLogObj.WriteLog(未查詢到該視圖名稱下該時間段內的上傳數據&#xff0c;視圖名稱&#xff1a; AViewname 開始時間&#xff1a; AStartdate 結束時間&#xff1a; AEnddate);exit…

【神經網絡與深度學習】Transformer原理

transformer ENCODER 輸入部分 對拆分后的語句x [batch_size, seq_len]進行以下操作 Embedding 將離散的輸入&#xff08;如單詞索引或其他類別特征&#xff09;轉換為稠密的實數向量&#xff0c;以便可以在神經網絡中使用。位置編碼 與RNN相比&#xff0c;RNN是一個字一個字…

Django Rest Framework 全局異常處理

在Django Rest Framework&#xff08;DRF&#xff09;中&#xff0c;全局異常處理是一種重要的機制&#xff0c;它可以幫助我們更好地管理API中的異常情況&#xff0c;并返回統一的錯誤響應。本文將詳細介紹兩種全局異常處理的方法&#xff1a;使用中間件&#xff08;Middlewar…

機器學習(3)

目錄 3-1線性回歸 3-2最小二乘解 3-3多元線性回歸 3-4廣義線性模型 3-5對率回歸 3-6對率回歸求解 3-7線性判別分析 3-8LDA的多類推廣 3-9多分類學習基本思路 3-10類別不平衡 3-1線性回歸 線性模型為什么重要&#xff1f; 人類在考慮問題時&#xff0c;通常…

用python寫一個自動生成android開機動畫的工具

要創建一個自動生成Android開機動畫的工具&#xff0c;你需要一些基本的知識&#xff0c;比如Python編程、圖像處理和Android開機動畫的格式。以下是一個簡單的Python腳本示例&#xff0c;它可以生成一個基本的Android開機動畫&#xff0c;具體效果可能需要更多的調整和優化。 …

記錄glide加載圖片,設置圓角

支持所有角的圓角&#xff0c;自動計算合適的半徑&#xff0c;不用擔心圖片比預定值小導致的圓角過大的問題 修改自&#xff1a;https://blog.csdn.net/qq_15059163/article/details/97613790 增加了指定圖片尺寸、解決了圖片某些情況下圓角過大的問題 public class GlideRou…

先有JVM還是先有垃圾回收器?很多人弄混淆了

是先有垃圾回收器再有JVM呢&#xff0c;還是先有JVM再有垃圾回收器呢&#xff1f;或者是先有垃圾回收再有JVM呢&#xff1f;歷史上還真是垃圾回收更早面世&#xff0c;垃圾回收最早起源于1960年誕生的LISP語言&#xff0c;Java只是支持垃圾回收的其中一種。下面我們就來刨析刨析…

外賣系統的JWT實現登錄

1、什么是JWT jwt可以生成一個加密的token&#xff0c;作為用戶登錄的令牌&#xff0c;當用戶登陸成功之后&#xff0c;發放給客戶端。請求需要登錄的資源或者接口的時候&#xff0c;將token攜帶&#xff0c;后端驗證token是否合法。jwt有三部分組成&#xff1a; A&#xff1a;…