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

資訊專欄INFORMATION COLUMN

C語(yǔ)言第三期(1萬(wàn)字函數(shù)-數(shù)組-操作符詳解)

Jeff / 2653人閱讀

摘要:形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動(dòng)銷毀了。函數(shù)調(diào)用傳值調(diào)用函數(shù)的形參和實(shí)參分別占有不同內(nèi)存塊,對(duì)形參的修改不會(huì)影響實(shí)參。函數(shù)的聲明一般出現(xiàn)在函數(shù)的使用之前。它其實(shí)就數(shù)組訪問(wèn)的操作符。

前言

  • 本期是C語(yǔ)言的第三期,需要看前面的幾期框架可以點(diǎn)到我博客里看一下。
  • 下一期博主就要對(duì)指針進(jìn)行總結(jié)了。同時(shí)我還會(huì)不定時(shí)分享一些干貨。期待你的回訪哦!
    ?? :熱愛(ài)編程學(xué)習(xí),期待一起交流!
    ?:博主水平有限,如有發(fā)現(xiàn)錯(cuò)誤,求告知,多謝!

函數(shù)

函數(shù)的定義

數(shù)學(xué)中我們常見(jiàn)到函數(shù)的概念。但是你了解C語(yǔ)言中的函數(shù)嗎?

  • 維基百科中對(duì)函數(shù)的定義:子程序
  • 在計(jì)算機(jī)科學(xué)中,子程序(英語(yǔ):Subroutine, procedure, function, routine, method, subprogram, callable unit),是一個(gè)大型程序中的某部分代碼,
    由一個(gè)或多個(gè)語(yǔ)句塊組成。它負(fù)責(zé)完成某項(xiàng)特定任務(wù),而且相較于其他代 碼,具備相對(duì)的獨(dú)立性。
  • 一般會(huì)有輸入?yún)?shù)并有返回值,提供對(duì)過(guò)程的封裝和細(xì)節(jié)的隱藏。這些代碼通常被集成為軟件庫(kù)。

函數(shù)的分類

  • 庫(kù)函數(shù)
  • 自定義函數(shù)

庫(kù)函數(shù) 為什么會(huì)有庫(kù)函數(shù)?

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

自定義函數(shù)

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

函數(shù)參數(shù)

實(shí)際參數(shù)(實(shí)參)

  • 真實(shí)傳給函數(shù)的參數(shù),叫實(shí)參。
  • 無(wú)論實(shí)參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時(shí),它們都必須有確定的值,以便把這些值傳送給形
  • 實(shí)參可以是:常量、變量、表達(dá)式、函數(shù)等。

形式參數(shù)(形參)

  • 像上面的實(shí)參(num1,num2)和形參(x,y)使用的不是同一空間。即他們的值所在的地址不同。
  • 形式參數(shù)是指函數(shù)名后括號(hào)中的變量,因?yàn)樾问絽?shù)只有在函數(shù)被調(diào)用的過(guò)程中才實(shí)例化(分配內(nèi)
    存單元),所以叫形式參數(shù)。
  • 形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動(dòng)銷毀了。因此形式參數(shù)只在函數(shù)中有
    效。
  • 我們可以簡(jiǎn)單的認(rèn)為:形參實(shí)例化之后其實(shí)相當(dāng)于實(shí)參的一份臨時(shí)拷貝。

函數(shù)調(diào)用

傳值調(diào)用

  • 函數(shù)的形參和實(shí)參分別占有不同內(nèi)存塊,對(duì)形參的修改不會(huì)影響實(shí)參。
  • 寫一個(gè)函數(shù)可以判斷一個(gè)數(shù)是不是素?cái)?shù)。
#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("是素?cái)?shù)");	}	else if(ret == 0)	{		printf("不是素?cái)?shù)");	}	return 0;}

傳址調(diào)用

  • 傳址調(diào)用是把函數(shù)外部創(chuàng)建變量的內(nèi)存地址傳遞給函數(shù)參數(shù)的一種調(diào)用函數(shù)的方式。
  • 這種傳參方式可以讓函數(shù)和函數(shù)外邊的變量建立起真正的聯(lián)系,也就是函數(shù)內(nèi)部可以直接操
    作函數(shù)外部的變量。
  • 傳址調(diào)用需要特別注意傳數(shù)組名。

函數(shù)的嵌套調(diào)用和鏈?zhǔn)皆L問(wèn)

嵌套調(diào)用

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

鏈?zhǔn)皆L問(wèn)(了解)

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

函數(shù)的聲明和定義

函數(shù)的聲明

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

函數(shù)遞歸(漢諾塔)

什么是遞歸?

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

遞歸的兩個(gè)必要條件

  • 存在限制條件,當(dāng)滿足這個(gè)限制條件的時(shí)候,遞歸便不再繼續(xù)。
  • 每次遞歸調(diào)用之后越來(lái)越接近這個(gè)限制條件
  • 下面是遞歸的典型問(wèn)題漢諾塔問(wèn)題。圖片來(lái)自百度。
#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);//塔數(shù)	int ret = Hanio_twice(num);	printf("完成%d層的漢諾塔需要%d步/n", num, ret);	return 0;}

數(shù)組

一維數(shù)組的創(chuàng)建和初始化

  • 數(shù)組是一組相同類型元素的集合。

數(shù)組的創(chuàng)建

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

數(shù)組的初始化

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

一維數(shù)組的使用

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

一維數(shù)組在內(nèi)存中的存儲(chǔ)

#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個(gè)元素的地址打印出來(lái)。 } return 0; }
  • 打印結(jié)果如下

  • 由圖片可知。

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

    • 數(shù)組在內(nèi)存中是連續(xù)存放的。
    • 用數(shù)組名指向整個(gè)存儲(chǔ)空間最小的地址

二維數(shù)組的創(chuàng)建和初始化

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

二維數(shù)組的使用

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

二維數(shù)組在內(nèi)存中的存儲(chǔ)

  • 像一維數(shù)組一樣,這里我們嘗試打印二維數(shù)組的每個(gè)元素。
#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的二維數(shù)組的每個(gè)元素的地址打印出來(lái),來(lái)研究其在內(nèi)存中的存儲(chǔ)。 }	 return 0; }
  • 打印結(jié)果如下。
  • 和上面的一維數(shù)組一樣,每次跳過(guò)四位數(shù),說(shuō)明二維數(shù)組在內(nèi)存中也是連續(xù)的。

數(shù)組越界

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

數(shù)組作為函數(shù)參數(shù)(傳址調(diào)用)

  • 我們下面以錯(cuò)誤的冒泡排序算法來(lái)舉例子。
#include <stdio.h>void bubble_sort(int arr[]){ int sz = sizeof(arr)/sizeof(arr[0]);//這一行代碼代碼錯(cuò)了.錯(cuò)誤思維是應(yīng)該是40/4=10    int i = 0;//但結(jié)果是4/4原因是因?yàn)閟izeof(arr)算出來(lái)的是首元素的地址,首元素的地址大小看機(jī)器,以32位的來(lái)說(shuō)是4字節(jié)。 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);//傳過(guò)去的是數(shù)組名,默認(rèn)是數(shù)組首元素的地址。    for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++)   {        printf("%d ", arr[i]);   }    return 0; }
  • 所以我們得出一個(gè)結(jié)論:數(shù)組作為函數(shù)參數(shù)的時(shí)候,不是把整個(gè)數(shù)組的傳遞過(guò)去。而傳遞的是數(shù)組首元素的地址。所謂傳調(diào)用

什么是數(shù)組名

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/123733.html

相關(guān)文章

  • 【零基礎(chǔ)趣學(xué)C語(yǔ)言】- 史上最全C語(yǔ)言函數(shù)詳解萬(wàn)字圖文+代碼演示+圖解)

    摘要:語(yǔ)言在設(shè)計(jì)中考慮了函數(shù)的高效性和易用性兩個(gè)原則。在語(yǔ)言中,最常見(jiàn)的當(dāng)屬函數(shù)了。以上就是一個(gè)函數(shù),它被稱為語(yǔ)言的入口函數(shù),或者主函數(shù)。例如和都是函數(shù)名。形式參數(shù)當(dāng)函數(shù)調(diào)用完成之后就自動(dòng)銷毀了。 ...

    468122151 評(píng)論0 收藏0
  • 怒肝1.5萬(wàn)字——史上最全C語(yǔ)言文件操作詳解

    摘要:二什么是文件磁盤上的文件就是文件。文件指針變量定義是一個(gè)指向類型數(shù)據(jù)的指針變量。表示向何種流中輸出,可以是標(biāo)準(zhǔn)輸出流,也可以是文件流。文件結(jié)構(gòu)體指針,將要讀取的文件流。 ...

    Alfred 評(píng)論0 收藏0
  • ??整理2萬(wàn)字帶你走進(jìn)C語(yǔ)言(詳細(xì)講解+代碼演示+圖解)??(強(qiáng)烈建議收藏?。。。?/b>

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

    邱勇 評(píng)論0 收藏0
  • 爆肝1萬(wàn)字c++入門綜合》

    摘要:大家好,今天屁孩君給大家?guī)?lái)入門綜合。年,標(biāo)準(zhǔn)委員會(huì)發(fā)布了語(yǔ)言的第一個(gè)國(guó)際標(biāo)準(zhǔn),該標(biāo)準(zhǔn)即為大名鼎鼎的。年,標(biāo)準(zhǔn)委員會(huì)發(fā)布了一份技術(shù)報(bào)告,詳細(xì)說(shuō)明了計(jì)劃引入的新特性。年月日,經(jīng)過(guò)標(biāo)準(zhǔn)委員投票,標(biāo)準(zhǔn)獲得一致通過(guò)。 ...

    _Dreams 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<