国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

C語言第三期(1萬字函數-數組-操作符詳解)

Jeff / 2660人閱讀

摘要:形式參數當函數調用完成之后就自動銷毀了。函數調用傳值調用函數的形參和實參分別占有不同內存塊,對形參的修改不會影響實參。函數的聲明一般出現在函數的使用之前。它其實就數組訪問的操作符。

前言

  • 本期是C語言的第三期,需要看前面的幾期框架可以點到我博客里看一下。
  • 下一期博主就要對指針進行總結了。同時我還會不定時分享一些干貨。期待你的回訪哦!
    ?? :熱愛編程學習,期待一起交流!
    ?:博主水平有限,如有發現錯誤,求告知,多謝!

函數

函數的定義

數學中我們常見到函數的概念。但是你了解C語言中的函數嗎?

  • 維基百科中對函數的定義:子程序
  • 在計算機科學中,子程序(英語:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一個大型程序中的某部分代碼,
    由一個或多個語句塊組成。它負責完成某項特定任務,而且相較于其他代 碼,具備相對的獨立性。
  • 一般會有輸入參數并有返回值,提供對過程的封裝和細節的隱藏。這些代碼通常被集成為軟件庫。

函數的分類

  • 庫函數
  • 自定義函數

庫函數 為什么會有庫函數?

  • 我們知道在我們學習C語言編程的時候,總是在一個代碼編寫完成之后迫不及待的想知道結果,想把這個結果打印到我們的屏幕上看看。這個時候我們會頻繁的使用一個功能:將信息按照一定的格式打印到屏幕上,用到printf函數。
  • 或者輸入一個數的時候,用到scanf函數。
  • 向上面的描述的基礎功能,我們在開發的過程中每個程序員都可能用的到,為了支持可移植性和提高程序的效率,所以C語言的基礎庫中提供了一系列類似的庫函數,方便程序員
    進行軟件開發。
  • 簡單的總結,C語言常用的庫函數都有:
    • IO函數
    • 字符串操作函數
    • 字符操作函數
    • 內存操作函數
    • 時間/日期函數
    • 數學函數
    • 其他庫函數
  • 當我們使用一個庫函數的時候不知道頭文件怎么用?
    • 這里強烈推薦中文版的一個文檔http://zh.cppreference.com
    • 用的時候只需要查找一下就可以了,不需要把庫函數全部記住,只需要學會如何查找就好了。

自定義函數

  • 如果庫函數能干所有的事情,那還要程序員干什么?
  • 所以更加重要的是自定義函數。
  • 自定義函數和庫函數一樣,有函數名,返回值類型和函數參數。
  • 但是不一樣的是這些都是我們自己來設計。這給程序員一個很大的發揮空間。
  • 函數的組成格式:
返回類型 函數名(參數類型 形式參數1,參數類型 形式參數2) {    函數體;    返回值;}
ret_type fun_name(para1, * ){ statement;//語句項}//ret_type 返回類型//fun_name 函數名//para1    函數參數
  • 我們舉個例子
  • 寫一個函數可以找出兩個整數中的最大值。
#include <stdio.h>//get_max函數的設計int get_max(int x, int y)//這里是get_max函數的定義,這里的x和y是形參,用來接收實參傳來的值。{ 	return (x>y)?(x):(y);//返回值}int main(){ 	 int num1 = 10; 	 int num2 = 20;	 int max = get_max(num1, num2);//這里是調用get_max函數,num1和num2均為實參。	 printf("max = %d/n", max);	 return 0}

函數參數

實際參數(實參)

  • 真實傳給函數的參數,叫實參。
  • 無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形
  • 實參可以是:常量、變量、表達式、函數等。

形式參數(形參)

  • 像上面的實參(num1,num2)和形參(x,y)使用的不是同一空間。即他們的值所在的地址不同。
  • 形式參數是指函數名后括號中的變量,因為形式參數只有在函數被調用的過程中才實例化(分配內
    存單元),所以叫形式參數。
  • 形式參數當函數調用完成之后就自動銷毀了。因此形式參數只在函數中有
    效。
  • 我們可以簡單的認為:形參實例化之后其實相當于實參的一份臨時拷貝。

函數調用

傳值調用

  • 函數的形參和實參分別占有不同內存塊,對形參的修改不會影響實參。
  • 寫一個函數可以判斷一個數是不是素數。
#include<stdio.h>#include<math.h>int is_prime(int n){	int i = 0;	for (i = 2; i < sqrt(n); i ++)	{		if (n % i == 0)		{			return 0;		}	}	return 1;}int main(){	int n = 0;	scanf("%d", &n);	int ret = is_prime(n);	if (ret == 1)	{		printf("是素數");	}	else if(ret == 0)	{		printf("不是素數");	}	return 0;}

傳址調用

  • 傳址調用是把函數外部創建變量的內存地址傳遞給函數參數的一種調用函數的方式。
  • 這種傳參方式可以讓函數和函數外邊的變量建立起真正的聯系,也就是函數內部可以直接操
    作函數外部的變量。
  • 傳址調用需要特別注意傳數組名。

函數的嵌套調用和鏈式訪問

嵌套調用

  • 函數和函數之間可以根據實際的需求進行組合的,也就是互相調用的。
#include <stdio.h>void new_line(){ printf("hehe/n");}void three_line(){    int i = 0; for(i=0; i<3; i++)   {        new_line();第二次調用   }}int main(){ three_line();//第一次調用 return 0; }
  • 函數可以嵌套調用,但是不能嵌套定義。

鏈式訪問(了解)

  • 把一個函數的返回值作為另外一個函數的參數。
#include <stdio.h>#include <string.h>int main(){    char arr[20] = "hello"; int ret = strlen(strcat(arr,"bit"));//這里介紹一下strlen函數 printf("%d/n", ret); return 0; }#include <stdio.h>int main(){    printf("%d", printf("%d", printf("%d", 43)));    //結果是啥?    //注:printf函數的返回值是打印在屏幕上字符的個數    return 0; }

函數的聲明和定義

函數的聲明

  • 告訴編譯器有一個函數叫什么,參數是什么,返回類型是什么。但是具體是不是存在,函數
    聲明決定不了。
  • 函數的聲明一般出現在函數的使用之前。要滿足先聲明后使用。
  • 函數的聲明一般要放在頭文件中的。(.h結尾的文件)
    ###函數的定義
  • 函數的定義是指函數的具體實現,交待函數的功能實現。
  • 一般放在源文件中(.c結尾的文件)

函數遞歸(漢諾塔)

什么是遞歸?

  • 程序調用自身的編程技巧稱為遞歸( recursion)。
  • 遞歸做為一種算法在程序設計語言中廣泛應用。 一個過程或函數在其定義或說明中有直接或間接 調用自身的一種方法,它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。
  • 遞歸的主要思考方式在于:把大事化小

遞歸的兩個必要條件

  • 存在限制條件,當滿足這個限制條件的時候,遞歸便不再繼續。
  • 每次遞歸調用之后越來越接近這個限制條件
  • 下面是遞歸的典型問題漢諾塔問題。圖片來自百度。
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>int Hanio_twice(int num){	if(1 == num)		return 1;	else		return 2 * Hanio_twice(num - 1) + 1;}int main(){	int num = 0;		scanf("%d", &num);//塔數	int ret = Hanio_twice(num);	printf("完成%d層的漢諾塔需要%d步/n", num, ret);	return 0;}

數組

一維數組的創建和初始化

  • 數組是一組相同類型元素的集合。

數組的創建

  • 數組的創建方式:
type_t   arr_name   [const_n];//type_t 是指數組的元素類型//const_n 是一個常量表達式,用來指定數組的大小。
  • 數組創建的實例:
//代碼1int arr1[10];//代碼2int count = 10;int arr2[count];//數組時候可以正常創建?//代碼3char arr3[10];float arr4[1];double arr5[20];

數組的初始化

  • 數組的初始化是指,在創建數組的同時給數組的內容一些合理初始值(初始化)。
  • 代碼如下
int arr1[10] = {1,2,3};int arr2[] = {1,2,3,4};int arr3[5] = {12345}char arr4[3] = {"a",98, "c"};char arr5[] = {"a","b","c"};char arr6[] = "abcdef";
  • 數組在創建的時候如果想不指定數組的確定的大小就得初始化。數組的元素個數根據初始化的內容來確定。
  • 但是對于下面的代碼要區分,內存中如何分配
char arr1[] = "abc";//內存里存放了四個元素 分別是"a""b""c""/0"char arr2[3] = {"a","b","c"};//而這里面存放的是"a""b""c"
  • 字符串的結束標志是‘/0’

一維數組的使用

  • 對于數組的使用我們之前介紹了一個操作符: [] ,下標引用操作符。它其實就數組訪問的操作符。
    我們來看代碼:
#include <stdio.h>int main(){ int arr[10] = {0};//數組的不完全初始化    int sz = sizeof(arr)/sizeof(arr[0]);//計算數組的元素個數 //對數組內容賦值,數組是使用下標來訪問的,下標從0開始。所以: int i = 0;//做下標 for(i=0; i<10; i++) { arr[i] = i;//這里i寫10,行嗎?當然不行,寫10意味著訪問的是第11個元素,數組會越界。 }  for(i=0; i<10; ++i) { printf("%d ", arr[i]); //輸出數組的內容 } return 0;}
  • 總結:
    • 數組是使用下標來訪問的,下標是從0開始。
    • 數組的大小可以通過計算得到。
int arr[10];int sz = sizeof(arr)/sizeof(arr[0]);//40/4=10;所以數組的長度是10

一維數組在內存中的存儲

#include <stdio.h>int main(){ int arr[10] = {0}; int i = 0;    int sz = sizeof(arr)/sizeof(arr[0]);     for(i=0; i<sz; ++i) { printf("&arr[%d] = %p/n", i, &arr[i]);//我們將10個元素的地址打印出來。 } return 0; }
  • 打印結果如下

  • 由圖片可知。

  • 每個地址相差四位數,9C和A0差四位,后面都是四位(這些數字都是16進制)。

    • 數組在內存中是連續存放的。
    • 用數組名指向整個存儲空間最小的地址

二維數組的創建和初始化

//數組創建int arr[3][4];char arr[3][5];double arr[2][4];
//數組初始化int arr[3][4] = {1,2,3,4};int arr[3][4] = {{1,2},{4,5}};int arr[][4] = {{2,3},{4,5}};//二維數組如果有初始化,行可以省略,列不能省略

二維數組的使用

  • 二維數組的使用也是通過下標的方式。
  • 代碼如下,創建一個3*4的二維數組,并對數組初始化輸入和輸出。圖形如下。
#include <stdio.h>int main(){	 int arr[3][4] = {0};//創建一個三行四列的二維數組	 int i = 0; for(i=0; i<3; i++) {	 	 int j = 0;		 for(j=0; j<4; j++) 		{		 arr[i][j] = i*j;//循環賦值	  } } for(i=0; i<3; i++) {	 int j = 0;	 for(j=0; j<4; j++)	 {	 	printf("%d ", arr[i][j]);//循環輸出 	 } }	 return 0; }

二維數組在內存中的存儲

  • 像一維數組一樣,這里我們嘗試打印二維數組的每個元素。
#include <stdio.h>int main(){ int arr[3][4]; int i = 0; for(i=0; i<3; i++) {	 int j = 0;	 for(j=0; j<4; j++)	 {		 printf("&arr[%d][%d] = %p/n", i, j,&arr[i][j]);	 }//將3*4的二維數組的每個元素的地址打印出來,來研究其在內存中的存儲。 }	 return 0; }
  • 打印結果如下。
  • 和上面的一維數組一樣,每次跳過四位數,說明二維數組在內存中也是連續的。

數組越界

  • 數組的下標是有范圍限制的。
  • 數組的下規定是從0開始的,如果數組有n個元素,最后一個元素的下標就是n-1。
  • 所以數組的下標如果小于0,或者大于n-1,就是數組越界訪問了,超出了數組合法空間的訪問。
  • 但是編譯器本身并不會報錯,所以此時需要程序員多加留意。
#include <stdio.h>int main(){ int arr[10] = {1,2,3,4,5,6,7,8,9,10};//定義了10個元素。    int i = 0;    for(i=0; i<=10; i++)   {        printf("%d/n", arr[i]);//當i等于10的時候,這時候訪問的是第11個元素!   } return 0; }

數組作為函數參數(傳址調用)

  • 我們下面以錯誤的冒泡排序算法來舉例子。
#include <stdio.h>void bubble_sort(int arr[]){ int sz = sizeof(arr)/sizeof(arr[0]);//這一行代碼代碼錯了.錯誤思維是應該是40/4=10    int i = 0;//但結果是4/4原因是因為sizeof(arr)算出來的是首元素的地址,首元素的地址大小看機器,以32位的來說是4字節。 for(i=0; i<sz-1; i++)   {        int j = 0;        for(j=0; j<sz-i-1; j++)       {            if(arr[j] > arr[j+1])           {                int tmp = arr[j];                arr[j] = arr[j+1];                arr[j+1] = tmp;           }       }   }}int main(){    int arr[] = {3,1,7,5,8,9,0,2,4,6};    bubble_sort(arr);//傳過去的是數組名,默認是數組首元素的地址。    for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)   {        printf("%d ", arr[i]);   }    return 0; }
  • 所以我們得出一個結論:數組作為函數參數的時候,不是把整個數組的傳遞過去。而傳遞的是數組首元素的地址。所謂傳調用

什么是數組名

#include <stdio.h>int main(){    int arr[10] = {1,23
                 
               
              

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/123733.html

相關文章

  • 【零基礎趣學C語言】- 史上最全C語言函數詳解萬字圖文+代碼演示+圖解)

    摘要:語言在設計中考慮了函數的高效性和易用性兩個原則。在語言中,最常見的當屬函數了。以上就是一個函數,它被稱為語言的入口函數,或者主函數。例如和都是函數名。形式參數當函數調用完成之后就自動銷毀了。 ...

    468122151 評論0 收藏0
  • 怒肝1.5萬字——史上最全C語言文件操作詳解

    摘要:二什么是文件磁盤上的文件就是文件。文件指針變量定義是一個指向類型數據的指針變量。表示向何種流中輸出,可以是標準輸出流,也可以是文件流。文件結構體指針,將要讀取的文件流。 ...

    Alfred 評論0 收藏0
  • ??整理2萬字帶你走進C語言(詳細講解+代碼演示+圖解)??(強烈建議收藏!!!)

    目錄 一、什么是C語言? 二、第一個C語言程序 代碼 程序分析 ?程序運行 一個工程中出現兩個及以上的main函數 代碼 運行結果 分析 三、數據類型 數據各種類型 為什么會有這么多的數據類型? 計算機單位 ?各個數據類型的大小 ?注意事項 數據類型的使用 四、變量和常量 變量的分類 變量的使用 變量的作用域和生命周期 ?常量 五、字符串+轉義字符+注釋 字符串 ?轉義字符 注釋 六、選擇語句 ?...

    邱勇 評論0 收藏0
  • 爆肝1萬字c++入門綜合》

    摘要:大家好,今天屁孩君給大家帶來入門綜合。年,標準委員會發布了語言的第一個國際標準,該標準即為大名鼎鼎的。年,標準委員會發布了一份技術報告,詳細說明了計劃引入的新特性。年月日,經過標準委員投票,標準獲得一致通過。 ...

    _Dreams 評論0 收藏0

發表評論

0條評論

Jeff

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<