學習筆記9-C語言-傳參、類型限定符、遞歸

函數傳參:

1、形參變量屬于它所在的函數,出了該函數就不能使用
2、實參與形參之間都是以賦值的形式進行數據傳遞(值傳遞)
3、return 其實是把返回值數據放置到一個公共的區域(函數和函數調用者),如果不寫return語句,那么該區域中就是一個隨機的垃圾數據
4、數組作為函數參數傳遞時,長度會丟失,需要額外增加一個變量把數組的長度也傳遞過去。
5、函數之間,數組的傳遞時址傳遞,函數與函數的調用者可以共享數組

練習1:實現一個函數,找出數組中的最大值

#include<stdio.h>int func(int a[],int len)
{int max=a[0];for(int i=1;i<len;i++){if(max<a[i])max=a[i];	}return max;
}int main(int argc,const char* argv[])
{int a[10]={0,1,2,3,4,5,6,7,8,155};int max= func(a,sizeof(a)/sizeof(a[0]));printf("%d",max);
}

練習2:實現一個函數,對數組進行排序

#include<stdio.h>void func(int a[],int len)
{int change;for(int i=0;i<len;i++){for(int j=i+1;j<len;j++){if(a[i]>a[j]){change=a[i];a[i]=a[j];a[j]=change;}}}
}int main(int argc,const char* argv[])
{int a[10]={15,95,18,19,47,85,63,25,98,46};int len=sizeof(a)/sizeof(a[0]);func(a,len);for(int i=0;i<len;i++){printf("%d ",a[i]);	}
}

練習3:實現一個函數,查找數組中是否存在某個值,如果存在,則返回該數據在數組中的下標,否則返回-1

#include<stdio.h>int func(int a[],int len,int n)
{for(int i=0;i<len;i++){if(a[i]==n)return i;	}return -1;
}int main(int argc,const char* argv[])
{int a[10]={0,2,1,3,4,5,6,7,8,9};int len=sizeof(a)/sizeof(a[0]);int ret=func(a,len,1);if(ret)printf("%d",ret);else printf("none");
}

設計函數時的準則:

1、一個函數最好只解決一個問題,這樣可以降低出錯率,提高可讀性。
2、最好不要依賴其他函數。(降低耦合性)
3、數據由調用者提供,結果返回給調用者(提高通用性)
4、要考慮調用者提供的非法數據,可以通過返回值方式告訴調用者,或者把可能出現的情況通過注釋的方式寫明白(健壯性)

進程映像:

程序:儲存在磁盤上的可執行文件(二進制文件、腳本文件)
進程:正在系統中運行的程序
進程映像:指的是進程內存的分布情況text    代碼段: 存儲二進制指令、常量,權限是只讀,強制修改會產生段錯誤
data    數據段: 存儲初始化過的全局變量、初始化過的靜態局部變量
bss     靜態數據段: 存儲未初始化過的全局變量,未初始化過的靜態局部變量,程序運行時會被清理為0   
stack   棧: 存儲局部變量、塊變量,會隨著程序運行不斷申請、釋放,由操作系統管理,小
heap    堆: 由程序猿手動管理,足夠大

局部變量和全局變量:

局部變量: 定義在函數內存儲位置: stack 棧生命周期: 函數調用開始直到知道函數執行結束使用范圍: 函數內使用全局變量: 定義在函數外存儲位置: data(初始化)、bss(未初始化)生命周期: 運行前就定義完成,程序結束才釋放適用范圍: 程序的任何位置都可以使用塊變量: 定義在語句塊內的 if{} for(){} while(){}存儲位置: stack 棧生命周期: 函數調用開始直到知道函數執行結束使用范圍: 只能在語句塊內使用
注意:1、局部變量可以和全局變量同名但是會屏蔽同名的全局變量,同名塊變量也會屏蔽同名的全局變量和局部變量2、建議全局變量首字母大寫

存儲介質:

硬盤->內存->高級緩存->寄存器

類型限定符:

auto:  用于定義自動申請、自動釋放內存的變量(局部變量),不加就代表加注意:全局變量不能用auto修飾C11標準中auto用于自動類型識別auto num =3.14
extern: 聲明變量,意思是說明此變量已在別處定義過了,請放心使用。但是只能臨時通過編譯,鏈接時找不到該變量,依然會報錯聲明時不可賦值
static:被它修飾過的局部變量叫靜態局部變量改變存儲位置:改變局部變量的儲存位置,由stack改到data或bss(由是否初始化決定改到那個段)延長生命周期: 延長局部變量的生命周期限制作用域:限制全局變量、函數只能在本文件中使用,可以防止全局變量、函數被別人調用可以防止防止命名沖突 
const:“保護”變量不被顯示地修改注意:如果對初始化過的全局變量、初始化過的靜態局部變量使用const修飾,那么存儲位置會變成text
volatile:如果變量值沒有顯示地改變,那么在使用這個變量時,不會從內存中讀取,而是繼續用上次讀取的結果,這叫編譯器的取值優化。如果變量被volatile修飾后,每次使用該變量時,不做取值優化,每次都從內存中讀取。一般在硬件編程、多線程編程時經常使用
register:申請把變量的存儲介質由內存改為寄存器。但是由于寄存器有限,所以不一定能申請成功注意:寄存器變量不允許獲取地址
typedef:類型重定義,定義變量前如果加入typedef,那么變量名就變成了這個類型注意:不是替換關系#define num int     替換typedef int num;    類型重定義從使用角度看一樣

遞歸:

函數自己調用自己的行為,有可能會造成死循環
遞歸可以實現分治這種算法,就是把一個復雜的大問題,分解成若干個相同的小問題,直到問題解決1、出口問題2、解決一個小問題3、調用自己計算出第n個斐波那契數列
int func(int n)
{if(1== n||2 == n) return 1;return func(n-1)+func(n-2);
}
1 1 2 3 5 8 13.......遞歸函數每調用一次都會在棧內產生一份自己的拷貝,直到到達出口,才會一層一層的釋放,因此使用遞歸時非常耗費內存,
與循環相比速度非常慢,能使用循環解決就用循環解決。不要試圖分解遞歸的過程遞歸優缺點:1、耗內存、速度慢2、好理解、思路清晰3、可以解決非線性的執行過程

作業:

1、用編程模擬漢諾塔的移動過程
#include<stdio.h>void show(char a,char c,int n)
{printf("%d %c->%c\n",n,a,c);	
}void func(int n,char a,char b,char c)
{if(n==1)show(a,c,n);else{func(n-1,a,c,b);show(a,c,n);func(n-1,b,a,c);}
}int main(int argc,const char* argv[])
{int n;scanf("%d",&n);func(n,'A','B','C');return 0;
}
2、輸入一個整數,計算出0~9每個數字出現幾次
#include<stdio.h>void func(int n,char a[])
{if(n==0)return;a[n%10]++;func(n/10,a);
}int main(int argc,const char* argv[])
{int n;scanf("%d",&n);char a[10]={};func(n,a);for(int i=0;i<10;i++){printf("%hhd:%hhd ",i,a[i]);	}
}

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

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

相關文章

Oracle創建視圖實現獲取當前數據所在的頁數,這里以每頁2條數據分頁

摘要&#xff1a;Oracle創建視圖實現獲取當前數據所在的頁數&#xff0c;這里以每頁2條數據分頁&#xff0c;詳細請看&#xff1a; 一&#xff1a; DROP VIEW MIP.TB_CMS_FLGTINFO_D_VIEW;/* Formatted on 2014/12/4 8:35:36 (QP5 v5.115.810.9015) */ CREATE OR REPLACE FOR…

學習筆記10-C語言-小項目-五子棋

小項目&#xff1a; 需要的數據 1、定義棋盤的二維數組 2、定義變量用于記錄下棋的坐標 3、定義角色 黑棋 O 白棋 * 空位業務邏輯&#xff1a; 是否需要對數據初始化 for(;;) {1、清屏、顯示棋盤2、落子坐標是否合法、該位置是否有棋子3、判斷是否五子連珠4、交換角色5、顯示…

學習筆記11-C語言-指針

什么是指針&#xff1a; 指針是一種特護的數據類型&#xff0c;使用它可以定義指針變量&#xff0c;指針變量存儲的是整型數據&#xff0c;代表內存的編號&#xff0c;通過這個編號可以訪問到對應內存。為什么使用指針 1、函數與函數之間是相互獨立的&#xff0c;但是有些時候…

學習筆記12-C語言-堆內存、字符串

什么是堆內存&#xff1a; 是進程中的一個內存段&#xff08;text\data\bss\heap\stack&#xff09;&#xff0c;由程序猿手動控制。 特點是足夠大&#xff0c;缺點是使用麻煩為什么要使用堆內存&#xff1a; 1、隨著程序的復雜&#xff0c;數據會越來越多。 2、其他的內存段…

學習筆記13-C語言-字符串函數、緩沖區

字符串的常用函數: #include<string.h> size_t strlen(const char* s); 功能&#xff1a;計算字符串長度&#xff0c;但是結果不包括\0 返回值&#xff1a;返回字符串中字符的個數size_t str_len(const char* str) {assert(NULL ! str);const char* tmp str;while(*tmp…

Oracle數據庫里面查詢字符串類型的字段不為空和為空的SQL語句:

摘要&#xff1a;近期項目中&#xff0c;在做高級查詢的時候有個條件是根據選擇的字段&#xff0c;然后再選擇字段的值為空和不為空做查詢&#xff0c;在寫SQL語句的時候費了很長時間&#xff0c;現在記錄一下&#xff0c;方便日后查看&#xff1a; 一&#xff1a;查詢字符串類…

學習筆記14-C語言-小項目-通訊錄

通訊錄&#xff1a; 要求&#xff1a; 姓名&#xff0c;性別、電話&#xff0c;最多儲存50個聯系人 功能&#xff1a;1、添加聯系人2、按名字刪除聯系人3、按姓名修改聯系人信息4、查找聯系人&#xff0c;可通過電話&#xff0c;名字查找&#xff0c;支持模糊查找5、顯示所有聯…

學習筆記15-C語言-預處理指令、條件編譯、頭文件

預處理指令&#xff1a; 程序猿編寫的代碼不是標準C代碼&#xff0c;并不能被真正的編譯器索編譯&#xff0c;需要一段程序把代碼翻譯一下。 翻譯的過程叫做預處理&#xff0c;被翻譯的代碼叫做預處理指令&#xff0c;以#開頭的都是預處理指令查看預處理的過程&#xff1a;gcc…

學習筆記16-C語言-小項目-使用Makefile完成2048

Makefile: Makefile是一系列編譯指令組成的可執行文本&#xff0c;也叫做編譯腳本。 在終端執行make命令會自動執行Makefile腳本中的編譯命令&#xff0c; 而且它還可以根據文件的最后修改時間來判斷哪些文件是否需要重新編譯、哪些文件不需要重新編譯&#xff0c;從而大大提高…

學習筆記17-C語言-結構、聯合、枚舉

結構&#xff1a; struct 結構是由程序猿自己設計的一種數據類型&#xff0c;用于描述一個事務的各項數據&#xff0c;由若干個不同的基礎數據類型組成。設計結構&#xff1a;struct 結構體名{類型 成員名&#xff1b;...}&#xff1b;定義結構體變量struct 結構體名 變量名&a…

Maven 3.0.5 安裝和配置:

摘要&#xff1a;現在的Web項目越來越多的都用maven管理了&#xff0c;所以我也抽時間學習學習&#xff0c;為了趕上時代&#xff01; 一&#xff1a;首先到maven官網&#xff1a;http://maven.apache.org/&#xff0c;然后選擇相應的版本下載&#xff0c;我這里下載的是maven…

學習筆記18-C語言-文件

文件的分類&#xff1a; 文本文件&#xff1a; 存儲的是ASCII碼值的二進制 二進制文件&#xff1a; 存儲的是數據的補碼文件IO&#xff1a; FILE *fopen(const char *path, const char *mode); 功能&#xff1a;打開或者創建文件 path&#xff1a;文件的路徑 mode&#x…

使用INNER JOIN ON 多表關聯查詢,獲取指定用戶下指定權限的資源SQL:

摘要&#xff1a;最近在看一個開源框架&#xff0c;其中用戶&#xff0c;角色&#xff0c;資源&#xff0c;這塊我感覺比較重要&#xff0c;所以就自己也模仿著寫了下&#xff0c;其中在獲取指定用戶下的權限資源的時候遇到問題了&#xff0c;開始時&#xff0c;我首先想到的方…

Maven學習記錄之maven基本操作命令,maven本地工廠的創建,maven骨架的生成,以及在eclipse中創建maven工程:...

摘要&#xff1a;今天又學習了一下maven&#xff0c;之前是下載并安裝和配置好了maven的環境&#xff0c;今天主要學習的內容包括&#xff1a;maven本地工廠的創建&#xff0c;maven骨架的生成命令&#xff0c;maven在dos下創建maven工程&#xff0c;以及在eclipse中創建mavne工…

Oracle中通過游標執行帶參數的存儲過程實現解析CLOB字段內的xml字符串:

摘要&#xff1a;近來之前的項目數據出現了問題&#xff0c;原因是由于之前在設計數據庫的時候把時間字段設置成了字符串格式&#xff0c;所以給后期的數據操作帶來了很大的麻煩&#xff0c;這里提醒一下各位程序猿&#xff0c;以后在開發項目的時候時間字段一定要是時間字段&a…

Eclipse中使用Checkstyle,checkstyle插件檢查java代碼的自定義配置文件:

摘要&#xff1a;近來項目組在搞代碼檢查&#xff0c;所以領導讓把checkstyle這個插件搞明白&#xff0c;現在我把我們寫的自定義的checkstyle.xml文件記錄一下&#xff0c;以便大家可以一起使用&#xff1a; 一&#xff1a;要使用checkstyle插件在eclipse中檢查java代碼&…

Linux 下安裝 jdk-7u75-linux-x64.gz,jdk1.7.0_75,jdk1.7步驟:

摘要&#xff1a;近來又用到了Linux系統&#xff0c;所以就又新裝了一個虛擬機和CentOS 6.4來用&#xff0c;搞開發的程序猿們可能都知道&#xff0c;在現在的很多企業中&#xff0c;生產環境大多都是Linux服務器&#xff0c;并且用的比較多的大都是CentOS&#xff0c;Red hat系…

Win7+VMware10.0+CentOS 6.4+Tomcat,Win7訪問不了CentOS6.4上的Tomcat

摘要&#xff1a;今天在linux下安裝Tomcat后&#xff0c;在虛擬機本地通過:http://localhost:8080/可以訪問安裝好的Tomcat服務器&#xff0c;但是在本機就不能訪問&#xff0c;前提是在本機下可以ping的通虛擬機的IP地址的&#xff0c;最后經過Google&#xff0c;發現說可能是…

Linux下配置OpenLDAP服務記錄

摘要&#xff1a;最近部門需要整合所有的系統&#xff0c;所以領導說要通過OpenLdap數據庫來實現對所有系統的統一管理&#xff0c;所以需要在服務器上配置一下LDAP服務&#xff0c;我們這里選擇的是OpenLdap服務&#xff0c;我在網上搜索了很多&#xff0c;開始都沒有配置成功…

Linux下配置CollabNet Subversion Edge

摘要&#xff1a;最近一直都在搞一下管理員的工作&#xff0c;今天又搞了svn的管理工具CollabNetSubversionEdge&#xff0c;網上也有很多例子&#xff0c;但是很多都是可以訪問到web界面&#xff0c;但是不能啟動版本庫的服務&#xff0c;所以我經過多次嘗試&#xff0c;終于解…