摘要:無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。形式參數當函數調用完成之后就自動銷毀了。函數的調用傳值調用函數的形參和實參分別占有不同內存塊,對形參的修改不會影響實參。沒有找到找到了下標為
目錄
提到函數,我們最先想到的肯定是數學中的函數,那么C語言中的函數究竟是什么呢?接下來帶大家看一下吧!
維基百科中對函數的定義:子程序
在計算機科學中,子程序(英語:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一個大型程序中的某部分代碼, 由一個或多個語句塊組 成。它負責完成某項特定任務,而且相較于其他代 碼,具備相對的獨立性。 一般會有輸入參數并有返回值,提供對過程的封裝和細節的隱藏。這些代碼通常被集成為軟 件庫。
1. 我們知道在我們學習C語言編程的時候,總是在一個代碼編寫完成之后迫不及待的想知道結果,想把這個結果打印到我們的屏幕上看看。這個時候我們會頻繁的使用一個功能:將信息按照一定的格 式打印到屏幕上(printf)。
2. 在編程的過程中我們會頻繁的做一些字符串的拷貝工作(strcpy)。
3. 在編程是我們也計算,總是會計算n的k次方這樣的運算(pow)。
像上面我們描述的基礎功能,它們不是業務性的代碼。我們在開發的過程中每個程序員都可能用的到, 為了支持可移植性和提高程序的效率,所以C語言的基礎庫中提供了一系列類似的庫函數,方便程序員進行軟件開發。
那么什么是庫函數呢?舉個簡單的例子,庫函數就是C語言本身給我們已經定義好的函數,作為程序員我們可以直接使用,就像printf()和scanf()。
注意:使用庫函數必須包含頭文件,例如我們使用printf()與scanf()時要引用stdio.h頭文件,即我們通常寫的#include
很多小伙伴就疑惑了,那么主函數是什么呢?主函數為什么叫main函數呢?我們必須使用main()函數嗎?接下來給大家解除這個疑惑!
首先給大家一個結論,C語言中默認main作為主函數的名字,但是主函數的名字卻不一定一定是main(),實際上,我們可以自己進行設定主函數的名字的,C語言中提供了#pragma comment()可以自己設定主函數的名字,有興趣的小伙伴可以自己去嘗試,在這個地方像喲啊告訴大家,作為程序的入口主函數的名字不一定必須是main(),希望大家可以記住這個!至于主函數為什么叫main()函數,這本身就是C語言默認的,如果硬要強行解釋一波的話,main()的英文意識 就是主要的意思。
IO函數
字符串操作函數
字符操作函數
內存操作函數
時間/日期函數
數學函數
其他庫函數
這個地方不會展開去講,后期用到的時候具體講解。
自定義函數就是程序員自己定義用于首先特定功能的函數!比如我們要完成兩個數的相加我們定義的add()函數就屬于自定義函數。
自定義函數和庫函數一樣,有函數名,返回值類型和函數參數。
但是不一樣的是這些都是我們自己來設計。這給程序員一個很大的發揮空間。
ret_type fun_name(para1, *){ statement;//語句項}ret_type 返回類型fun_name 函數名para1 函數參數
(1)寫一個函數可以找出兩個整數中的最大值。
#include
//get_max函數的設計int get_max(int x, int y){ return (x > y) ? (x) : (y);}int main(){ int num1 = 10; int num2 = 20; int max = get_max(num1, num2); printf("max = %d/n", max); return 0;}
這個地方給大家解釋一下三目運算符,即上面的(x>y)?(x):(y),這個地方表示的是,如果x>y成立,就返回x的值,反之就返回y的值,這樣就達到了求最大值的目的!
(2)寫一個函數求兩個數的和
#include
//get_add函數的設計int get_add(int x, int y){ return (x + y);}int main(){ int num1 = 10; int num2 = 20; int sum = get_add(num1, num2); printf("sum = %d/n", sum); return 0;}
真實傳給函數的參數,叫實參。 實參可以是:常量、變量、表達式、函數等。
注意:為什么可以是函數呢?因為有的函數是由返回值的,所以自然也就能充當實參。
無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形 參。
形式參數是指函數名后括號中的變量,因為形式參數只有在函數被調用的過程中才實例化(分配內 存單 元),所以叫形式參數。形式參數當函數調用完成之后就自動銷毀了。因此形式參數只在函數中有效。
為什么這樣說呢?接下來給大家舉個例子吧!
例如我們要交換兩個變量的值:
#include
void swap(int x, int y){ int temp = x; x = y; y = temp;}int main(){ int num1 = 10; int num2 = 20; swap(num1, num2); printf("num1 = %d/nnum2 = %d", num1,num2); return 0;}
下面是代碼的運行結果:
很明顯,并沒有達成交換的目的,這就證明了:形式參數當函數調用完成之后就自動銷毀了,即我們把num1和num2傳給x和y之后,雖然我們在函數例將x和y交換了,但是由于x和y在swap函數調用完成后就銷毀了,即并沒有真正實現num1和num2的交換。
所以我們可以簡單的認為:形參實例化之后其實相當于實參的一份臨時拷貝。
函數的形參和實參分別占有不同內存塊,對形參的修改不會影響實參。我們上述的交換的例子就是傳值調用,即并不能真正達成交換兩個變量的值的目的!
傳址調用是把函數外部創建變量的內存地址傳遞給函數參數的一種調用函數的方式。
這種傳參方式可以讓函數和函數外邊的變量建立起真正的聯系,也就是函數內部可以直接操 作函數外部的變量。
同樣,我們就以前面的交換兩個變量的值的例子來給大家進行舉例!
#include
void swap(int *x, int *y){ int temp = *x; *x = *y; *y = temp;}int main(){ int num1 = 10; int num2 = 20; swap(&num1, &num2); printf("num1 = %d/nnum2 = %d", num1,num2); return 0;}
這個地方為什么會發生這種情況呢?等后期我們學到指針的那一節的時候將會具體講解!
#include
int is_leap_year(int year){ if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { return 1; } else { return 0; }}int main(){ int year = 0; int flag = 0; scanf("%d", &year); flag=is_leap_year(year); if (1 == flag) { printf("是閏年!"); } else { printf("不是閏年!"); } return 0;}
#include
#include int is_prime_num(int n){ int flag = 0; int i = 0; for (i = 2; i <= sqrt(n); i++) { if (n % i == 0) { return 0; } } return 1;}int main(){ int i = 0; for (i = 100; i < 200; i++) { int flag = 0; flag=is_prime_num(i); if (1 == flag) { printf("%d ", i); } else continue; } return 0;}
#include
int find_num(int arr[], int size,int k){ int left = 0; int right = 0; right = size - 1; int mid = 0; while (left <= right) { mid = (left + right) / 2; if (arr[mid] < k) { left = mid + 1; } else if (arr[mid] > k) { right = mid - 1; } else { return mid; } } if (left > right) { return -1; }}int main(){ int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int k = 7; int size = 0; size = sizeof(arr) / sizeof(arr[0]); int ret = 0; ret = find_num(arr, size,k); if (-1 == ret) { printf("沒有找到!"); } else { printf("找到了!下標為%d", ret); } return 0;}
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/123958.html
摘要:表達式表達式為調整部分,用于循環條件的調整。語句的循環控制變量建議不可在循環體內修改循環變量,防止循環失去控制。建議語句的循環控制變量的取值采用前閉后開區間寫法。注意當條件初始化條件判斷條件更新都省略后,程序將進入死循環。 目錄 3.2 for循環 3.2.1?語法 3.2.2 break與...
摘要:目錄循環循環語句的語法語句的語法執行流程執行流程語句的特點語句的特點循環中的和循環中的和練習練習計算的階乘。多層循環這種情況使用是達不到目的的。它只能從最內層循環退出到上一層的循環。 目錄 3.3 do...while()循環 3.3.1 do語句的語法: 3.3.2 執行流程 3.3.3...
摘要:前陣子,我們分享了中的基本數據類型轉換這篇文章,對許多粉絲還是有帶來幫助的,今天講一下包裝類的的由來,及自動裝箱拆箱的概念和原理。下面是基本數據類型與對應的包裝類型。 showImg(https://segmentfault.com/img/remote/1460000016537706); 前陣子,我們分享了《Java中的基本數據類型轉換》這篇文章,對許多粉絲還是有帶來幫助的,今天講...
摘要:棧長得到消息,停止開發了。。。是一個輕量級的容錯組件,其靈感來自于,主要為和函數式編程設計的看到這里,棧長表示學不動了。。。上面說了,官方推薦替代的開源組件,這個棧長也沒有用過,查了下,資料也比較稀少。 showImg(https://segmentfault.com/img/remote/1460000017201104?w=1600&h=1066); 棧長得到消息,Hystrix ...
摘要:前陣子,發布了一個黑科技,號稱是一個全新的通用全棧虛擬機,并具有高性能跨語言交互等逆天特性,真有這么神奇簡介是一個跨語言的通用虛擬機,不僅支持了等基于的語言,以及等基于的語言,還支持其他像和語言等。原生鏡像加速來看這段代碼,同樣來自官網。 前陣子,Oracle 發布了一個黑科技 GraalVM,號稱是一個全新的通用全棧虛擬機,并具有高性能、跨語言交互等逆天特性,真有這么神奇? Graa...
閱讀 1877·2021-11-19 09:40
閱讀 2594·2021-08-30 09:46
閱讀 2177·2021-08-03 14:01
閱讀 2648·2019-08-30 10:54
閱讀 1196·2019-08-29 16:38
閱讀 1440·2019-08-29 11:02
閱讀 2536·2019-08-28 18:16
閱讀 1679·2019-08-28 18:09