1. 程式人生 > >C語言函式詳解

C語言函式詳解

1.1函式的原型和呼叫 1 ,定義一個函式 有返回值的情況: double circle( double r) // 這裡r 是形參 形參一定是一個變數 { return 3.1415926 * 2 * r; //返回值的型別一定是定義的函式型別,這裡是double } 返回值的情況: void sayhello(char s[]) { printf("hello,%s!!!\n",s); } 2 在使用函式前必須定義或者宣告函式 #include <stdio.h>  double circle(double r); void sayhello(char s[]);//當函式在main函式前定義的時候,在使用函式前,必須先宣告
1.2   函式的形參與實參 在定義函式的時候,函式大多數都有引數,在被主調函式需要傳遞資料給函式的引數 函式定義時用的變數叫形參 傳遞給函式的中形參值或變數叫實參
int main()
{
	double a = 12.2;
	double C = circle(2.1111); //a 是實參,實參可以是你變數,也可以是常量
	printf("圖的周長為:%F\n", C);
	sayhello("inx");
}
double circle( double r)      // 這裡r 是形參 形參一定是一個變數
{
	return 3.1415926 * 2 * r; //返回值的型別一定是定義的函式型別,這裡是double
}

注意: 1形參在未出現函式呼叫時,他們並不佔用記憶體單元,只有在發生函式呼叫的時候形參才被分配記憶體,函式呼叫完成後,形參所佔的記憶體被釋放 2實參可以是變數,常量或者表示式 3在定義函式時,一定要指定形參的資料型別 4形參與實參的資料型別一定要可相容 5C語言中,實參與形參的資料傳遞是“值傳遞”,即單向傳遞,只由實參傳遞給形參,而不能由形參傳遞給實參。 演示值傳遞:
#include <stdio.h>
void value_pass();

int main()
{
	double a = 12.2;
	value_pass(a);
	printf("a=%F", a); //當a傳遞給函式形參a的時候,只是把值賦給a,a=12.200000 
	return 0;
}
void value_pass(double a)
{
	a = a + 2;
	printf("a=%F", a);//輸出結果 a + 2;
}

輸出結果: a=14.200000 a=12.200000 注:如果函式的引數是個陣列,或者字串的時候,那麼是可以通過形參修改實參的值的() 1.3函式的返回型別與返回值 1函式的返回值通過函式中的return獲得,如果函式的返回值為void可以不需要return語句。 2函式return語句中的返回值資料型別應該與函式定義時相同。 3如果函式中沒有return語句,那麼函式將返回一個不確定的值。 1.4main函式與exit函式與函式的return語句 程式碼: exit(0);//退出程式 return 0;//退出函式 1.5多個原始碼檔案程式的編譯 1.5.1標頭檔案的使用 如果把main函式放在第一個檔案中,而把自定義函式放在第二個檔案中,那麼就需要在第一個檔案中宣告函式原型。 如果把函式原型包含在一個頭檔案裡,那麼就不必每次使用函式的時候都宣告其原型了。把函式宣告放入標頭檔案是很好的習慣。 1.5.2#include#define的意義 #include就是簡單的檔案內容替換 #define就是簡單的文字替換而已 1.5.3#ifndef#endif #ifndef的意思就是條件預編譯,如果#ifndef 後面的條件成立,那麼就預編譯從#ifndef開始到#endif之間的程式碼,否則不會去預編譯這段程式碼 1.6函式的遞迴 函式可以呼叫自己,這就叫函式的遞迴: 先序遞迴演示: 程式碼
#include <stdio.h>
void test(int n)
{
	printf("n=%d\n", n);
	n--;
	if ( n > 0)
	{
		test(n);
	}
}
int main()
{
	int i = 10;
	test(i);
}

列印結果: n=10 n=9 n=8 n=7 n=6 n=5 n=4 n=3 n=2 n=1 後序遞迴(主體在遞迴後面): 程式碼
#include <stdio.h>

void test(int n)
{
	n--;
	if ( n > 0)
	{
		test(n);
	}
	printf("n=%d\n", n);
}
int main()
{
	int i = 10;
	test(i);
}

顯示結果: n=0 n=1 n=2 n=3 n=4 n=5 n=6 n=7 n=8 n=9 1.6.1遞迴的過程分析 n個人排成一隊,問第n個人多少歲,他回答比前面一個人大2歲,再問前面一個人多少歲,他回答比前面一個人大2歲,一直問到最後問第一個人,他回答10 程式碼:
#include <stdio.h>
int age(n)
{
	if (n == 1)
	{
		return 10;
	}
	else
	{
		return age(n - 1) + 2;
	}
}

int main()
{
	int n = 10;
	printf("第N個人%d歲\n",age(10));
}

 列印結果: 第N個人28歲 10進位制數轉化為二進位制數的例子 234在十進位制下為2 * 102次方 + 3 * 101次方 + 4*100次方。 奇數的二進位制最後一位一定是1,偶數的二進位制最後一位一定是0 可以通過 number % 2 得到二進位制形式的最後一位,如果要將一個完整的整數轉化為二進位制就需要用到遞迴函式。 在遞迴呼叫之前,計算 number % 2的值,然後在遞迴呼叫語句之後進行輸出,這樣計算出的第一個數值反而在最後一個輸出。 為了得出下一個數,需要把原數除以2,這種計算相當於十進位制下把小數點左移一位,如果此時得出的數是偶數,,則下一個二進位制的數值是0,如果得出的是奇數,那麼下一個二進位制數為1 直到被2除的結果小於2,就停止遞迴。 程式碼: int bin(int n) //將十進位制n 轉化為二進位制數 { int a = n % 2; int b = n / 2; if (b > 0) { bin(b); } printf("%d",a); } int main() { int n = 100; bin(n); //printf("第N個人%d歲\n",age(10)); 列印結果: 1100100 斐波那契數列例子 斐波那契數列指的是這樣一個數列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... 0項是0,第1項是第一個1 這個數列從第2項開始,每一項都等於前兩項之和。 程式碼:
int fib(n)
{
	if (n == 1) 
		return 0;
	if (n == 2)
	{
		return 1;
	}
	if (n >= 3)
	{
		return fib(n - 2) + fib(n - 1);
	}
}
int main()
{
	int n = 10;
	printf("fibs前10項為:");
	for (int i = 1; i <= n;i++)
	{
		printf("%d ",fib(i));
	}
	//printf("第N個人%d歲\n",age(10));
} 

列印結果: fibs前10項為:0 1 1 2 3 5 8 13 21 34 1.6.2遞迴的優點 遞迴給某些程式設計問題提供了最簡單的方法 1.6.3遞迴的缺點 一個有缺陷的遞迴會很快耗盡計算機的資源,遞迴的程式難以理解和維護。

相關推薦

C語言函式

1.1函式的原型和呼叫 1 ,定義一個函式 有返回值的情況: double circle( double r) // 這裡r 是形參 形參一定是一個變數 { return 3.1415926

C++建構函式及顯示呼叫建構函式

                         

C語言指標(經典,非常詳細)

C語言指標詳解(經典,非常詳細) 前言:複雜型別說明     要了解指標,多多少少會出現一些比較複雜的型別,所以我先介紹一下如何完全理解一個複雜型別,要理解複雜型別其實很簡單,一個型別裡會出現很多運算子,他們也像普通的表示式一樣,有優先順序,其優先順序和運算優先

Canny邊緣檢測演算法原理及C語言實現

Canny運算元是John Canny在1986年提出的,那年老大爺才28歲,該文章發表在PAMI頂級期刊上的(1986. A computational approach to edge detection. IEEE Transactions on Pattern Analy

[C] C語言sizeof - 全部型別

VC++6.0環境 文章目錄 總結 結構體struct 聯合union union與struct混合 參考文章 總結 union看最大 找struct最大的基礎資料型別,每個成員變數都要與

c語言移位

實驗平臺 vs2017 左移位和右移位有區別. 左移位比較簡單,就是直接在低位後面補0; 右移位則比較複雜, 假設有10000000的二進位制數,往右移動一位,則數變為11000000,原因在於補的高位是原來的第一位, 也就是說如果是01000000,則往右移動

C語言指標

前言 這不是我第一次寫關於C指標的文章了,只是因為指標對於C來說太重要,而且隨著自己程式設計經歷越多,對指標的理解越多,因此有了本文。然而,想要全面理解指標,除了要對C語言有熟練的掌握外,還要有計算機硬體以及作業系統等方方面面的基本知識。所以我想通過一篇文章來儘可能

連結串列的插入和刪除操作C語言實現+註釋)

連結串列的基本操作中,連結串列結點的插入和刪除相對比較複雜,需根據結點插入位置的不同,使用合理的方法在不破壞原連結串列結構的前提下將其插入到連結串列中。 本節將詳解介紹這兩種操作的具體實現方法,讀者只需牢記實現步驟,即可輕鬆解決這兩大難點。 連結串列中插入結點 連結串列中插入結點,根據插入位置的不同,可

順序表的插入操作原理及實現(C語言

順序表中存放資料的特點和陣列這種資料型別完全吻合,所以順序表的實現使用的是陣列。換句話說,順序表中插入元素問題也就等同於討論如何向陣列中插入資料。 因此,順序表中插入資料元素,無非三種情況: 在表頭插入; 在表的中間某個位置插入; 直接尾隨順序表,作為表的最後一個元素; 無論在順序表的什麼位置插

全!面!的!c語言操作符

算術操作符:+ - * / % 除了%操作符以外,其他幾個操作符都可以作用與整數和浮點數 對於/操作符若兩數都是整數執行整數除法;只要有浮點數就執行浮點數除法 %操作符的兩個運算元必須是整數 移位操作符:<< 左移操作符 >> 右移操

典型C語言指標

一、細說指標 指標是一個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的一個地址。要搞清一個指標需要搞清指標的四方面的內容:指標的型別、指標所指向的型別、指標的值或者叫指標所指向的記憶體區、指標本身所佔據的記憶體區。讓我們分別說明。 先宣告幾個指標放著做例子: 例一

順序棧的基本操作(入棧和出棧)及C語言實現

棧,可以理解為遵循“後入先出”原則的線性表,因此棧結構可以採用順序表或連結串列實現。 順序棧的實現採用的是順序表,也就是陣列。 順序棧的實現思想是:在陣列中設定一個隨時指向棧頂元素的變數(一般命名為 top ),當 top 的值為 -1 時,說明陣列中沒有資料,即棧中沒有資料元素,為“空棧”;只要資料元素

Android NDK——必知必會之JNI的C++操作函式和小結(三)

引言 上一篇講解了一些關於JNI和NDK的必知必會的理論知識和機制,由於篇幅問題把關於JNI的重要的函式放到這篇,具體使用留到下一篇,此係列文章基連結: 一、JNI中的函式概述 在JNI層我們基本上都是通過env指標來呼叫jni.h標頭檔案裡定義的函式,JNI

C語言 指標 C語言指標變數的運算

指標變數儲存的是地址,本質上是一個整數,可以進行部分運算,例如加法、減法、比較等,請看下面的程式碼: #include <stdio.h>int main(){ int a = 10, *pa = &a, *paa = &a;

[轉]C語言指標(經典,非常詳細)

寫得很好啊! 這裡寫一下筆記好了 1 int p; //這是一個普通的整型變數 2 int *p; //首先從P 處開始,先與*結合,所以說明P 是一個指標,然後再與int 結合,說明指標所指向的內容的型別為int 型.所以P是一個返回整型資料的指標 3 int p[3]; //首先從P 處開始,

C語言指標----指標宣告定義賦值

C語言的指標是讓新手很頭疼的事情,但是由於其太過於靈活,以至於可以很好得的解決一些複雜的問題,因此不得不掌握。我最近正在學習指標相關的內容,因此在這裡做一個小的總結。本篇是不涉及到函式以及結構體

C#Random()函式

隨機數的使用很普遍,可用它隨機顯示圖片,用它防止無聊的人在論壇灌水還可以用來加密資訊等等。本文討論如何在一段數字區間內隨機生成若干個互不相同的隨機數,比如在從1到20間隨機生成6個互不相同的整數,並通過此文介紹Visual c#中隨機數的用法。 .net.Frameword中提供了一個專門產

C語言操作符

對於C語言操作符,根據我所掌握的內容可以總結如下: 1.算數操作符 算數操作符就是我們最常見的“加減乘數模”:+    -   *    /     %,需要注意的有兩點 1.兩個整數相除是整數,所

Mysql C API函式

mysql_init() MYSQL *mysql_init(MYSQL *mysql) 描述 分配或初始化與mysql_real_connect()相適應的MYSQL物件。如果mysql是NULL指標,該函式將分配、初始化、並返回新物件。否則,將初始

連結串列的基本操作(C語言

《連結串列及建立》一節我們學習瞭如何使用連結串列儲存資料元素,以及如何使用 C 語言建立連結串列。本節將詳細介紹對連結串列的一些基本操作,包括對連結串列中資料的新增、刪除、查詢(遍歷)和更改。 注意,以下對連結串列的操作實現均建立在已建立好連結串列的基礎上,建立連結串列的程式碼如下所示: //宣告節點結構