黑馬程序員----C語言函數

</pre><a target=_blank target="_blank" href="——-"></a><pre name="code" class="csharp"><h2 id="函數概述" style="margin: 0.8em 0px; padding: 0px; box-sizing: border-box; font-weight: 100; color: rgb(51, 51, 51); font-family: 'microsoft yahei'; line-height: 26px;"><span style="color: rgb(51, 51, 51); font-size: 14px; font-family: 'microsoft yahei'; line-height: 17px;">——</span><a target=_blank target="_blank" href="http://www.itheima.com/" style="color: rgb(51, 102, 153); text-decoration: none; font-size: 14px; font-family: 'microsoft yahei'; line-height: 17px;">Java培訓、Android培訓、iOS培訓、.Net培訓</a><span style="color: rgb(51, 51, 51); font-size: 14px; font-family: 'microsoft yahei'; line-height: 17px;">、期待與您交流! ——-</span>
</h2><h2 id="函數概述" style="margin: 0.8em 0px; padding: 0px; box-sizing: border-box; font-weight: 100; color: rgb(51, 51, 51); font-family: 'microsoft yahei'; line-height: 26px;">函數的介紹</h2><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 1.1em; color: rgb(51, 51, 51); font-family: 'microsoft yahei'; font-size: 14px; line-height: 26px;"> 函數的定義<br style="box-sizing: border-box;" />構成c語言程序的基本單元就是函數。函數中包含程序的可執行代碼。每個c程序的入口和出口都位於main函數之中。編寫程序時並不是將所有內容都放在主函數main中。爲了方便規劃、組織、編寫和調試,一般將一個程序劃分爲若干個程序模塊,每一個程序模塊完成一部分功能。</p><p style="box-sizing: border-box; margin-top: 0px; margin-bottom: 1.1em; color: rgb(51, 51, 51); font-family: 'microsoft yahei'; font-size: 14px; line-height: 26px;"> <br style="box-sizing: border-box;" />        主函數可以調用其它函數,其它函數也可以互相調用。在main函數中調用其它函數,這些函數執行完畢後又返回到main函數中。通常把這些被調用的函數稱爲下層函數。函數調用發生時,立即執行被調用的函數,而調用者則進入等待的狀態,直到被調用函數執行完畢。 <br style="box-sizing: border-box;" />示例1:</p><pre class="prettyprint" name="code" style="white-space: nowrap; word-wrap: break-word; box-sizing: border-box; margin-top: 0px; margin-bottom: 1.1em; font-family: 'Source Code Pro', monospace; padding: 5px 5px 5px 60px; font-size: 14px; line-height: 1.45; word-break: break-all; background-color: rgba(128, 128, 128, 0.0470588); border: 1px solid rgba(128, 128, 128, 0.0745098); border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; position: relative; overflow-y: hidden; overflow-x: auto;"><code class="hljs cpp has-numbering" style="display: block; padding: 0px; background-color: transparent; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal;"><span class="hljs-preprocessor" style="box-sizing: border-box;">#include <stdio.h></span>
<span class="hljs-keyword" style="box-sizing: border-box;">void</span> run()<span class="hljs-comment" style="box-sizing: border-box;">//定義函數run</span>
{
    <span class="hljs-built_in" style="box-sizing: border-box;">printf</span>(<span class="hljs-string" style="box-sizing: border-box;">"run\n"</span>);
}
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> main()
{
    run();<span class="hljs-comment" style="box-sizing: border-box;">//調用函數run</span>
    <span class="hljs-keyword" style="box-sizing: border-box;">return</span> <span class="hljs-number" style="box-sizing: border-box;">0</span>;
}</code>

示例1展示了在main函數中如何調用函數,這個函數實現了一個功能,運行結果是:run

函數格式是:

<code class="hljs css has-numbering" style="display: block; padding: 0px; background-color: transparent; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal; background-position: initial initial; background-repeat: initial initial;"> 返回值類型  函數名(形式參數列表)
 <span class="hljs-rules" style="box-sizing: border-box;">{
    <span class="hljs-rule" style="box-sizing: border-box;">函數體
 }</span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>

它包括4個部分: 
 
函數名:就是函數的標識符,命名要遵守標識符的命名規範。 
 
返回值類型:函數的返回值類型就是c語言各種數據類型中的某一種,函數可以沒有返回值(在函數名前添加關鍵詞void)。 
 
形式參數列表:可以有多個形式參數也可以沒有,函數被調用時實際參數的值將被賦值給相應的形式參數。 

函數體:這部分是函數的核心,這部分程序塊實現了某項功能。可以通過c語言各種語法的使用編成一段可執行代碼實現某項功能。

示例2:

<code class="hljs perl has-numbering" style="display: block; padding: 0px; background-color: transparent; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal;">void jump()
{
    <span class="hljs-keyword" style="box-sizing: border-box;">printf</span>(<span class="hljs-string" style="box-sizing: border-box;">"jump\n"</span>);
}
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> sum(<span class="hljs-keyword" style="box-sizing: border-box;">int</span> <span class="hljs-keyword" style="box-sizing: border-box;">x</span>, <span class="hljs-keyword" style="box-sizing: border-box;">int</span> <span class="hljs-keyword" style="box-sizing: border-box;">y</span>)
{
    <span class="hljs-keyword" style="box-sizing: border-box;">return</span> <span class="hljs-keyword" style="box-sizing: border-box;">x</span> + <span class="hljs-keyword" style="box-sizing: border-box;">y</span>;
}
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> fun()
{
    <span class="hljs-keyword" style="box-sizing: border-box;">return</span> <span class="hljs-number" style="box-sizing: border-box;">10</span> - <span class="hljs-number" style="box-sizing: border-box;">9</span>;
}
void test(<span class="hljs-keyword" style="box-sizing: border-box;">int</span> a, <span class="hljs-keyword" style="box-sizing: border-box;">int</span> b)
{
     <span class="hljs-keyword" style="box-sizing: border-box;">printf</span>(<span class="hljs-string" style="box-sizing: border-box;">"<span class="hljs-variable" style="box-sizing: border-box;">%d</span> + <span class="hljs-variable" style="box-sizing: border-box;">%d</span> = <span class="hljs-variable" style="box-sizing: border-box;">%d</span>\n"</span>, a, b, a + b);<span style="color: inherit;">
}</span></code><ul class="pre-numbering" style="color: rgb(51, 51, 51); box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li></ul>

以上我們定義了兩個不同的函數,第一個函數無返回值無形參,第二個函數有返回值有形參,第三個函數有返回值無形參,第四個函數無返回值有形參,這些寫法都對,不管怎樣就是不能不寫函數名。 

函數的聲明和定義可以分開寫,定義可以放在mian函數的後面,但是聲明必須放在mian函數的前面,下面舉例說明。

示例3:

<code class="hljs axapta has-numbering" style="display: block; padding: 0px; background-color: transparent; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal;"><span class="hljs-preprocessor" style="box-sizing: border-box;">#include <stdio.h></span>
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> <span class="hljs-keyword" style="box-sizing: border-box;">sum</span>(<span class="hljs-keyword" style="box-sizing: border-box;">int</span> a, <span class="hljs-keyword" style="box-sizing: border-box;">int</span> b);
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> main()
{
    <span class="hljs-keyword" style="box-sizing: border-box;">int</span> x = <span class="hljs-number" style="box-sizing: border-box;">5</span>, y = <span class="hljs-number" style="box-sizing: border-box;">6</span>;
    <span class="hljs-keyword" style="box-sizing: border-box;">int</span> s = <span class="hljs-keyword" style="box-sizing: border-box;">sum</span>(x,y);
    printf(<span class="hljs-string" style="box-sizing: border-box;">"s = %d\n"</span>, s);
    <span class="hljs-keyword" style="box-sizing: border-box;">return</span> <span class="hljs-number" style="box-sizing: border-box;">0</span>;
}
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> <span class="hljs-keyword" style="box-sizing: border-box;">sum</span>(<span class="hljs-keyword" style="box-sizing: border-box;">int</span> a, <span class="hljs-keyword" style="box-sizing: border-box;">int</span> b)
{
    <span class="hljs-keyword" style="box-sizing: border-box;">return</span> a + b;
}</code>

示例3的運行結果是:s = 11 
函數可以多次聲明,只聲明不定義的函數編譯時可以通過但是鏈接時會失效。

函數調用

 
常規調用: 
在主函數中利用這條語句:函數名(實際參數列表);就可以調用函數。實際參數要和被調用函數的形式參數類型一致。函數可以先聲明,再定義。函數的聲明和定義可以分開寫。函數是這樣聲明的:返回值 函數名(形式參數列表); 
如果要將函數定義在main函數後面則要在main函數前面加上這個函數的聲明。按照程序自上而下執行的理論,如果前面沒有這個函數卻在main函數中調用,計算機將找不到這個函數。

示例4:

<code class="hljs axapta has-numbering" style="display: block; padding: 0px; background-color: transparent; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal;"><strong><span class="hljs-preprocessor" style="box-sizing: border-box;">#include <stdio.h></span>
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> main()
{
    <span class="hljs-keyword" style="box-sizing: border-box;">int</span> x = <span class="hljs-number" style="box-sizing: border-box;">5</span>, y = <span class="hljs-number" style="box-sizing: border-box;">6</span>;
    <span class="hljs-keyword" style="box-sizing: border-box;">int</span> s = <span class="hljs-keyword" style="box-sizing: border-box;">sum</span>(x,y);
    printf(<span class="hljs-string" style="box-sizing: border-box;">"s = %d\n"</span>, s);
    <span class="hljs-keyword" style="box-sizing: border-box;">return</span> <span class="hljs-number" style="box-sizing: border-box;">0</span>;
}
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> <span class="hljs-keyword" style="box-sizing: border-box;">sum</span>(<span class="hljs-keyword" style="box-sizing: border-box;">int</span> a, <span class="hljs-keyword" style="box-sizing: border-box;">int</span> b)
{
    <span class="hljs-keyword" style="box-sizing: border-box;">return</span> a + b;
}</strong></code>

示例4的這段代碼在編譯的時候會發出一個警告:warning: implicit declaration of function 'sum' is invalid in C99 
但是仍然可以鏈接通過生成一個可執行文件。這是因爲c語言是個弱語法,語法正確編譯器會通過編譯和鏈接生成可執行文件。規範期間我們在寫程序時還是要把函數的聲明寫在main函數前面。

 
嵌套調用: 
函數也可以嵌套調用,即在一個函數中調用另一個函數。比如在自定義的函數中使用printf函數就是嵌套調用函數。下面將舉例說明嵌套調用的方式。

示例5:

<code class="hljs axapta has-numbering" style="display: block; padding: 0px; background-color: transparent; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal;"><span class="hljs-preprocessor" style="box-sizing: border-box;">#include <stdio.h></span>
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> <span class="hljs-keyword" style="box-sizing: border-box;">sum</span>(<span class="hljs-keyword" style="box-sizing: border-box;">int</span> x, <span class="hljs-keyword" style="box-sizing: border-box;">int</span> y)
{
    <span class="hljs-keyword" style="box-sizing: border-box;">return</span> x + y;
}
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> result(<span class="hljs-keyword" style="box-sizing: border-box;">int</span> x, <span class="hljs-keyword" style="box-sizing: border-box;">int</span> y)
{
   <span class="hljs-keyword" style="box-sizing: border-box;">return</span> <span class="hljs-keyword" style="box-sizing: border-box;">sum</span>(x, y);
}
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> main()
{
    <span class="hljs-keyword" style="box-sizing: border-box;">int</span> a = <span class="hljs-number" style="box-sizing: border-box;">9</span>, b = <span class="hljs-number" style="box-sizing: border-box;">2</span>;
    <span class="hljs-keyword" style="box-sizing: border-box;">int</span> c = result(a, b);
    printf(<span class="hljs-string" style="box-sizing: border-box;">"c = %d\n"</span>, c);
    <span class="hljs-keyword" style="box-sizing: border-box;">return</span> <span class="hljs-number" style="box-sizing: border-box;">0</span>;
}</code>

示例5的運行結果是:c = 11 
注意函數不能嵌套定義。


遞歸調用: 
遞歸調用就是函數直接或者間接的調用自己。間接調用就是在遞歸函數調用的下層函數中再調用自己。

示例6:

<code class="hljs cpp has-numbering" style="display: block; padding: 0px; background-color: transparent; box-sizing: border-box; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal;"><strong><span style="font-family:SimSun;font-size:14px;"><span class="hljs-preprocessor" style="box-sizing: border-box;">#include <stdio.h></span>
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> factorial(<span class="hljs-keyword" style="box-sizing: border-box;">int</span> x)<span class="hljs-comment" style="box-sizing: border-box;">//定義一個函數用來計算階乘</span>
{
    <span class="hljs-keyword" style="box-sizing: border-box;">if</span> (x == <span class="hljs-number" style="box-sizing: border-box;">1</span>)
    {
        <span class="hljs-keyword" style="box-sizing: border-box;">return</span> <span class="hljs-number" style="box-sizing: border-box;">1</span>;<span class="hljs-comment" style="box-sizing: border-box;">//必須有一個明確的結果,遞歸纔有使用意義</span>
    }
    <span class="hljs-keyword" style="box-sizing: border-box;">return</span> factorial(x-<span class="hljs-number" style="box-sizing: border-box;">1</span>)*x;<span class="hljs-comment" style="box-sizing: border-box;">//函數自己調用自己,這句是遞歸調用的核心</span>
}
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> main()
{
    <span class="hljs-keyword" style="box-sizing: border-box;">int</span> a = <span class="hljs-number" style="box-sizing: border-box;">5</span>;
    <span class="hljs-keyword" style="box-sizing: border-box;">int</span> b = factorial(<span class="hljs-number" style="box-sizing: border-box;">5</span>);<span class="hljs-comment" style="box-sizing: border-box;">//計算5的階乘</span>
    <span class="hljs-built_in" style="box-sizing: border-box;">printf</span>(<span class="hljs-string" style="box-sizing: border-box;">"b = %d\n"</span>, b);
    <span class="hljs-keyword" style="box-sizing: border-box;">return</span> <span class="hljs-number" style="box-sizing: border-box;">0</span>;
}</span></strong></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="color: rgb(51, 51, 51); font-family: 'Source Code Pro', monospace; font-size: 14px; box-sizing: border-box; padding: 0px 5px;">2</li><li style="color: rgb(51, 51, 51); font-family: 'Source Code Pro', monospace; font-size: 14px; box-sizing: border-box; padding: 0px 5px;">3</li><li style="color: rgb(51, 51, 51); font-family: 'Source Code Pro', monospace; font-size: 14px; box-sizing: border-box; padding: 0px 5px;">4</li><li style="color: rgb(51, 51, 51); font-family: 'Source Code Pro', monospace; font-size: 14px; box-sizing: border-box; padding: 0px 5px;">5</li><li style="color: rgb(51, 51, 51); font-family: 'Source Code Pro', monospace; font-size: 14px; box-sizing: border-box; padding: 0px 5px;">6</li><li style="color: rgb(51, 51, 51); font-family: 'Source Code Pro', monospace; font-size: 14px; box-sizing: border-box; padding: 0px 5px;">7</li><li style="color: rgb(51, 51, 51); font-family: 'Source Code Pro', monospace; font-size: 14px; box-sizing: border-box; padding: 0px 5px;">8</li><li style="color: rgb(51, 51, 51); font-family: 'Source Code Pro', monospace; font-size: 14px; box-sizing: border-box; padding: 0px 5px;">9</li><li style="color: rgb(51, 51, 51); font-family: 'Source Code Pro', monospace; font-size: 14px; box-sizing: border-box; padding: 0px 5px;">10</li><li style="color: rgb(51, 51, 51); font-family: 'Source Code Pro', monospace; font-size: 14px; box-sizing: border-box; padding: 0px 5px;">11</li><li style="color: rgb(51, 51, 51); font-family: 'Source Code Pro', monospace; font-size: 14px; box-sizing: border-box; padding: 0px 5px;">12</li><li style="color: rgb(51, 51, 51); font-family: 'Source Code Pro', monospace; font-size: 14px; box-sizing: border-box; padding: 0px 5px;">13</li><li style="color: rgb(51, 51, 51); font-family: 'Source Code Pro', monospace; font-size: 14px; box-sizing: border-box; padding: 0px 5px;">14</li><li style="color: rgb(51, 51, 51); font-family: 'Source Code Pro', monospace; font-size: 14px; box-sizing: border-box; padding: 0px 5px;">15</li><li style="color: rgb(51, 51, 51); font-family: 'Source Code Pro', monospace; font-size: 14px; box-sizing: border-box; padding: 0px 5px;">16</li></ul>

示例6的運行結果是:b = 120

參數

形參:定義函數時,函數名後面的參數,比如num1和num2。函數體內部不能定義和形參同名的變量。 一個函數 可以沒有形參,也可以有無限個形參。 
實參:調用函數時,傳入的具體數據,比如a和b。實參和形參的個數必須相等。 
如果是基本的數據類型作爲形參,則是純粹的值傳遞,修改函數內部形參的值並不會影響到實參的值。如果傳入的是指針變量或者是某個實參的地址,那麼在函數內部修改形參的值會影響到實參。下面舉例說明。

示例7:

<code class="hljs perl has-numbering" style="display: block; padding: 0px; background-color: transparent; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal;">include <stdio.h>
void test(<span class="hljs-keyword" style="box-sizing: border-box;">int</span> <span class="hljs-variable" style="box-sizing: border-box;">*a</span>,<span class="hljs-keyword" style="box-sizing: border-box;">int</span> <span class="hljs-variable" style="box-sizing: border-box;">*b</span>)
{
    <span class="hljs-keyword" style="box-sizing: border-box;">int</span> <span class="hljs-keyword" style="box-sizing: border-box;">x</span> = <span class="hljs-number" style="box-sizing: border-box;">0</span>,<span class="hljs-keyword" style="box-sizing: border-box;">y</span> = <span class="hljs-number" style="box-sizing: border-box;">1</span>;
    <span class="hljs-variable" style="box-sizing: border-box;">*a</span> = <span class="hljs-keyword" style="box-sizing: border-box;">x</span>;
    <span class="hljs-variable" style="box-sizing: border-box;">*b</span> = <span class="hljs-keyword" style="box-sizing: border-box;">y</span>;
}
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> main()
{
    <span class="hljs-keyword" style="box-sizing: border-box;">int</span> c = <span class="hljs-number" style="box-sizing: border-box;">5</span>,d = <span class="hljs-number" style="box-sizing: border-box;">9</span>;
    <span class="hljs-keyword" style="box-sizing: border-box;">int</span> <span class="hljs-variable" style="box-sizing: border-box;">*p1</span> = &c;
    <span class="hljs-keyword" style="box-sizing: border-box;">int</span> <span class="hljs-variable" style="box-sizing: border-box;">*p2</span> = &d;
    <span class="hljs-keyword" style="box-sizing: border-box;">printf</span>(<span class="hljs-string" style="box-sizing: border-box;">"沒有調用任何函數:c = <span class="hljs-variable" style="box-sizing: border-box;">%d</span>\td = <span class="hljs-variable" style="box-sizing: border-box;">%d</span>\n"</span>,c, d);
    test(p1,p2);
    <span class="hljs-keyword" style="box-sizing: border-box;">printf</span>(<span class="hljs-string" style="box-sizing: border-box;">"調用完test函數:c = <span class="hljs-variable" style="box-sizing: border-box;">%d</span>\td = <span class="hljs-variable" style="box-sizing: border-box;">%d</span>\n"</span>,c, d);
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li><li style="box-sizing: border-box; padding: 0px 5px;">
</li></ul>

示例7中我們將兩個變量的地址傳入到函數test中,那麼函數test中的指針形參會根據地址找到這兩個實參並將它們的值修改。所以示例7的運行結果是: 
沒有調用任何函數:c = 5 d = 9 
調用完test函數:c = 0 d = 1

返回值


返回值的使用注意: 
C語言是弱類型的語言,非常不嚴格。如果沒有寫清楚返回值的類型,則默認爲int型的 。寫了void則代表沒有返回值,就算明確聲明瞭返回值類型,也可以不返回任何的值。

示例8:

<code class="hljs axapta has-numbering" style="display: block; padding: 0px; background-color: transparent; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-top-left-radius: 0px; border-top-right-radius: 0px; border-bottom-right-radius: 0px; border-bottom-left-radius: 0px; word-wrap: normal;"><span class="hljs-preprocessor" style="box-sizing: border-box;">#include <stdio.h></span>
<span class="hljs-keyword" style="box-sizing: border-box;">sum</span>(<span class="hljs-keyword" style="box-sizing: border-box;">double</span> a, <span class="hljs-keyword" style="box-sizing: border-box;">double</span> b)
{
    <span class="hljs-keyword" style="box-sizing: border-box;">return</span> a + b;
}
<span class="hljs-keyword" style="box-sizing: border-box;">int</span> main()
{
    <span class="hljs-keyword" style="box-sizing: border-box;">double</span> x = <span class="hljs-number" style="box-sizing: border-box;">5.1</span>, y = <span class="hljs-number" style="box-sizing: border-box;">6.2</span>;
    <span class="hljs-keyword" style="box-sizing: border-box;">int</span> s = <span class="hljs-keyword" style="box-sizing: border-box;">sum</span>(x,y);
    printf(<span class="hljs-string" style="box-sizing: border-box;">"s = %d\n"</span>, s);
    <span class="hljs-keyword" style="box-sizing: border-box;">return</span> <span class="hljs-number" style="box-sizing: border-box;">0</span>;
}</code>

示例8的運行結果是:s = 11 
示例8中的函數sum沒有明確返回值類型那麼默認就是int類型,將兩個double型的值傳進去返回的是int型的結果。編譯時會發出一個警告:warning: type specifier missing, defaults to 'int' 不會報錯,編譯鏈接都可以通過,這是c語言的弱類型語言性質決定的。


return 的作用: 
返回一個具體的值給函數的調用者。在主函數中寫:return 0; 則意味着主函數結束,退出程序。c語言規定return後面跟0屬正常退出,寫其它的值也可以退出沒有影響,但這不是規範寫法。

多文件分工


文件的開頭加:#include <.stdio.h> 這條語句,是將系統的頭文件拷貝過來。include "abc.txt" 則是把自己寫的abc.txt文件中的所用內容以純文本的方式拷貝到當前位置。 


""表示文件與.c文件處於同一路徑,可以使用相對路徑也可以使用絕對路徑。左邊有/的是絕對路徑,沒有/則爲相對路徑。通常我們使用相對路徑。 
注意自定義的文件使用"",系統文件使用< >。 
 
在實際開發中,當項目比較大時,通常需要多人分工來完成。不同的人在不同的.c文件中寫不同的函數實現不同的功能,最後將所有的.c文件一起編譯鏈接。我們知道程序執行的入口是main函數,如何使用其它.c文件中的函數而系統又不會報錯或者發出警告呢?這時候就需要用到.h文件。.h文件用來放所有函數的聲明,那麼只要在main函數前將放有所有函數聲明的.h文件拷貝進來,那麼在main函數中就能使用其他人在別的.c文件中寫的函數了。 
通常在開發中我們會將系統的主頭文件(.h)文件拷到main函數之前,這樣系統自帶的函數庫我們才能使用。 
函數的定義放在.c文件中,函數的聲明放在.h文件中。如果要是在某個.c文件中用另一個.c文件中定義的函數,只需要包含另一個.c文件對應的.h文件即可。 .h文件只是被別人拿來拷貝包含的,編譯鏈接時不用寫出來。當然.h文件中也可以把函數的聲明和定義全寫了供.c文件拷貝使用,這種情況編譯鏈接時也不用把它寫出來。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章