C語(yǔ)言程序設(shè)計(jì) 浙江大學(xué):翁愷

7、1 函數(shù)的定義和使用
一、初見函數(shù)

1、
例1
( 素?cái)?shù)(prime)求和 )

藍(lán)色部分:判斷是否為素?cái)?shù)
功能非常單純
改后:
- 定義自己的函數(shù)
- 簡(jiǎn)化主函數(shù)

2、
例2



二、

2、return 語(yǔ)句

- (多個(gè)return語(yǔ)句,沒錯(cuò)但不好,不符合單一出口的要求,出口太多不好修改)

- 。

- ?7.1函數(shù)的定義和使用 - 從函數(shù)中返回(SHD) P70 - 07:30?


/////////////////////////////////////
7、2函數(shù)的參數(shù)和變量
////////////////////////////////////
/// 一、


2、***

·例



3.

a、【塊內(nèi)】本地變量定義在塊內(nèi)

b、【前不存在離消失】程序運(yùn)行進(jìn)入這個(gè)塊之前其中的變量不存在;
離開這個(gè)快,其中的變量就消失了

(??i有值了,沒初始化,是個(gè)亂七八糟的值)

(??離開了大括號(hào)后i也不在了(not found))

c、【外對(duì)里有效】塊外面定義的變量在里面仍存在有效,里面定義的變量到外面就不存在了

d、【里掩外】塊里面的定義了和外面同名的變量則掩蓋了外面的(Java不這樣哦)

e、【不同內(nèi)】不能在同一個(gè)塊內(nèi)定義同名變量(redefinition重新定義)

f、本地變量不會(huì)默認(rèn)初始化(變量得到一個(gè)任意的值)(不會(huì)得到一個(gè)默認(rèn)的初始的值)
e、參數(shù)在進(jìn)入函數(shù)的時(shí)候被初始化了
(調(diào)用函數(shù)時(shí)一定要給參數(shù)對(duì)應(yīng)的值,那個(gè)值就會(huì)在進(jìn)入函數(shù)的時(shí)候用來初始化參數(shù))
/// 二、

1、

2、

a、

b、
(??隱含的從double到int的轉(zhuǎn)換,這個(gè)轉(zhuǎn)換把值從2.4變到2,所以會(huì)造成損失下,但得到的是warning,程序仍能運(yùn)行)

c、

d、


3、
a、下圖倆函數(shù)中ab雖然同名,但存在于不同的地方,所以是沒有聯(lián)系的變量 ,其僅僅在調(diào)用中傳遞了值,所以不能做出swap函數(shù)的效果

4、傳值
a、(not found in current context)每一個(gè)變量都只在他自己的那個(gè)函數(shù)所在的空間里頭)
b、actual parameter/real parameter形參/實(shí)參
(后面會(huì)用指針來保存a,b地址 進(jìn)而通過函數(shù)來交換值)


/// 三、

( 其他細(xì)節(jié))
1、

void f()未知 x ; void f(void)沒有參數(shù)

2、
a、一層,逗號(hào)表示標(biāo)點(diǎn)符號(hào)
b、加一層括號(hào),表明先做括號(hào)里面的運(yùn)算,這時(shí)“,”為逗號(hào)運(yùn)算符(a,b)--->b
ab區(qū)別:傳了2個(gè)還是1個(gè)參數(shù)進(jìn)去

3、
可以在一個(gè)函數(shù)里放另一個(gè)函數(shù)的聲明,但不能放另一個(gè)函數(shù)的body/定義
??No?。?!

4、
可以但不建議a,b:
a、int--->定義int型變量i,j,聲明sum函數(shù)要兩個(gè)int作為參數(shù)并且返回一個(gè)int
所以------>最好拿出sum放在函數(shù)外面,函數(shù)的原型聲明應(yīng)該拿出來
b、return +表達(dá)式,因?yàn)?/span>變量+圓括號(hào)也是表達(dá)式,所以這個(gè)圓括號(hào)沒有意義,它沒錯(cuò)但容易讓人誤解以為return是一個(gè)函數(shù),所以不要這么寫
??No?。?!

5、

·是函數(shù)
·可
·有

編譯,運(yùn)行,echo $?

//////////////
四、函數(shù)原型
1.

如果調(diào)用函數(shù)放下面了-----??No?。。?!電腦會(huì)自己猜、無效(invalied),可能不匹配

2、函數(shù)原型聲明:把函數(shù)的頭復(fù)制了前面加分號(hào),
聲明要和定義一致

3.函數(shù)原型總結(jié)

·現(xiàn)在??(函數(shù)外面)

??舊(函數(shù)里面的前面)

·函數(shù)原型里可不寫參數(shù)名字,因?yàn)榫幾g器做檢查不會(huì)檢查參數(shù)名稱,只檢查參數(shù)類型

/////////////////////////////////////////////////////////////////////////
8:數(shù)組 ····1數(shù)組
····2數(shù)組運(yùn)算
/////////////////////////////////////////////////////////////////////////
8-1-1

1、


??危險(xiǎn):因?yàn)閏nt不能超過number使用的下標(biāo)

//////////////
8-1-2數(shù)組的使用:如何定義和使用數(shù)組,
數(shù)組的下標(biāo)和下標(biāo)范圍

1、定義數(shù)組:<類型>變量名稱[元素?cái)?shù)量]

c99開始已經(jīng)可以用變量定義數(shù)組的大小了
2、數(shù)組特點(diǎn)
·同數(shù)據(jù)類型
·創(chuàng)不改
·連續(xù)依次排列

??數(shù)組在 賦值號(hào)左邊:往里面寫入東西
?? 賦值號(hào)右邊:讀取它的值

3、數(shù)組的單元
·每單元—一個(gè)變量
·[ ]索引/下標(biāo),從0開始編號(hào)/數(shù)數(shù)——>
—>最大的下標(biāo)是數(shù)組個(gè)數(shù)減一,而不是數(shù)組個(gè)數(shù)

4、有效的下標(biāo)范圍
。不會(huì)檢查數(shù)組下標(biāo)是否越界(segmentation fault)
。需自己保證只使用有效下標(biāo)值[0,數(shù)組大小-1]

5、測(cè)試越界會(huì)怎樣
int a[10](十個(gè)int的a)-->a[10]不是有效下標(biāo),有效下標(biāo)是a[0到9],零到九已經(jīng)十個(gè)了
??past the end of array(有的這warning檢測(cè)不到)

6、越界解決方案—回歸上一課最后的題目

解決方案:
a、用戶在讀數(shù)字的過程中作記數(shù)
if cnt達(dá)到100(讀滿100個(gè)數(shù)了),程序不能接受更多的數(shù)了,所以就不能再記數(shù)了
b、利用C99特性:定義數(shù)組時(shí)采用的大小是動(dòng)態(tài)的,是個(gè)的變量值(創(chuàng)建數(shù)組)
讓用戶先輸入的數(shù)字是用來表明下面要輸入多少個(gè)數(shù)字構(gòu)成數(shù)組來參與程序的運(yùn)算
7、長(zhǎng)度為0的數(shù)組,可,存在但無用

///////////////////////////////////////////////////////
8-1-3數(shù)組例子:統(tǒng)計(jì)個(gè)數(shù)(應(yīng)用題)


變量多,十個(gè)變量----數(shù)組

magic number---10多次出現(xiàn),不知道其是否有關(guān)系
。const變量----決定數(shù)組大小
。定義數(shù)組-----count數(shù)組number個(gè)
。初始化數(shù)組-----因?yàn)閿?shù)組變量和本地變量一樣,本地變量不能夠自動(dòng)得到默認(rèn)的初始值,所以安全起見,在第一次使用之前必須要主動(dòng)初始它,數(shù)組變量也如此
又因?yàn)槌跏蓟瘮?shù)組當(dāng)中每一個(gè)元素比較麻煩,所以寫循環(huán)遍歷數(shù)組,去給每一個(gè)元素賦值
。數(shù)組參與運(yùn)算
·求平均數(shù)時(shí)要把數(shù)記錄下來
·記數(shù)時(shí)要用獨(dú)到的數(shù)做下標(biāo),來讓某一個(gè) 計(jì)數(shù)器加一
。遍歷數(shù)組做輸出
??用到數(shù)組的程序所需環(huán)節(jié)??

/////////////////////
8、2數(shù)組運(yùn)算{沒看完,跳過看指針,別忘了回來看}
///////////////////// ,
8.2數(shù)組運(yùn)算

||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
9、1指針
/////////////////////
9.1-1取地址運(yùn)算符取得變量的地址
/////////////////////
1、and符號(hào),一個(gè)運(yùn)算符,取得變量地址

2、@為啥變量變量會(huì)有地址??:
3、若需讓printf給我們輸出一個(gè)地址,要用%p,而不是真的直接把他當(dāng)成整數(shù),地址和整數(shù)并不永遠(yuǎn)相同,與架構(gòu)有關(guān)??

4、
&只能對(duì)一個(gè)明確的 變量取地址????

相鄰變量的地址:(c語(yǔ)言內(nèi)存模型)堆棧(stack)-自頂向下分配

關(guān)于數(shù)組地址

////////////////
9.1-2指針變量就是記錄地址的變量
////////////////////

1、

2、學(xué)計(jì)算機(jī)-心理強(qiáng)大-嘿嘿嘿吼吼吼哈哈哈(我精神狀態(tài)正常…吧)
3、指針-保存地址p-point



4、

注釋——參數(shù): 參數(shù),也叫參變量,是一個(gè)變量。我們?cè)谘芯慨?dāng)前問題的時(shí)候,關(guān)心某幾個(gè)變量的變化以及它們之間的相互關(guān)系,其中有一個(gè)或一些叫自變量,另一個(gè)或另一些叫因變量。如果我們引入一個(gè)或一些另外的變量來描述自變量與因變量的變化,引入的變量本來并不是當(dāng)前問題必須研究的變量,我們把這樣的變量叫做參變量或參數(shù)。英文名:Parameter。


5 、

*單目運(yùn)算符,用來訪問指針的值所表示的地址,在那個(gè)地址上的變量

6、

7、
指針的兩個(gè)運(yùn)算符&*互相反作用
——&取地址|*取地址所代表的變量

8、
忘了and,編譯器沒報(bào)錯(cuò)但運(yùn)行的時(shí)候錯(cuò)了,因?yàn)橥薬nd但正好是個(gè)整數(shù),正好又是32位架構(gòu),整數(shù)和地址一樣大,你把一個(gè)地址傳進(jìn)去和把一個(gè)整數(shù)傳進(jìn)去對(duì)scanf來說沒什么區(qū)別,他會(huì)以為你存進(jìn)去的i是i的地址,但他不知道

::