![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pn5GcuMjN0ETZklTZlVjM0EWN1EWYmhDO4QmNyUmN4YzYlRDMvw1M0UDM1UzNtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
文章目錄
-
- 函數
-
- 傳值調用與引用調用
- 作用域
- 數組
-
- 多元數組
- 數組作為函數參數
- 定制輸入輸出函數
函數
函數是一組一起執行一個任務的語句。每個 C 程式都至少有一個函數,即主函數 main() ,所有簡單的程式都可以定義其他額外的函數。
return_type function_name( parameter list )
{
body of the function
}
複制
在C語言中,一個函數的組成部分有如下:
傳回類型:return_type 是函數傳回的值的資料類型。有些函數執行所需的操作而不傳回值,在這種情況下,return_type 可以是關鍵字 void。
函數名稱:這是函數的實際名稱(function_name)。函數名和參數清單一起構成了函數簽名。
參數:當函數被調用時,有時候需要向參數傳遞一個值,這個值被稱為實際參數。參數清單包括函數參數的類型、順序、數量。參數是可選的,也就是說,函數可能不包含參數。
參數中也存在預設參數,預設參數即在函數簽名中賦予了某個參數預設值,如果在調用函數的時候不指定該參數值,則該參數取值為預設。
預設參數置于參數清單的最右端、
在給預設參數指派的時候,最好指定參數名對應資料。
函數主體:函數主體包含一組定義函數執行任務的語句。
複制
實作一個比大小的函數:
/* 函數傳回兩個數中較大的那個數 */
int max(int num1, int num2)
{
/* 局部變量聲明 */
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
複制
調用這個函數:
int main ()
{
/* 局部變量定義 */
int a = 100;
int b = 200;
int ret;
/* 調用函數來擷取最大值 */
ret = max(a, b);
printf( "Max value is : %d\n", ret );
return 0;
}
複制
傳值調用與引用調用
調用類型 | 描述 |
---|---|
傳值調用 | 該方法把參數的實際值複制給函數的形式參數。在這種情況下,修改函數内的形式參數不會影響實際參數。 |
引用調用 | 通過指針傳遞方式,形參為指向實參位址的指針,當對形參的指向操作時,就相當于對實參本身進行的操作。 |
上面那就是傳值調用,至于引用調用,等我講指針了再說吧。現在講也捋不清楚啊。
作用域
這個其實應該再編碼規範的時候寫的,但是那會兒給忘了,現在補上。
全局變量:在所有函數外部的全局變量,通常是在程式的頂部。全局變量在整個程式生命周期内都是有效的。記住這點,我們以後會為這點做出重大舉措的!!!
局部變量:在函數或塊内部的局部變量(這裡的塊指的是:函數、結構體、分支、循環、異常等),局部變量在函數外部是不可知的。
數組
在 C 中要聲明一個數組,需要指定元素的類型和元素的數量:
type arrayName [ arraySize ]; //這裡的大小也可以不設定,能設定就設定
複制
示例:
double balance[5] = {1000.0, 2.0, 3.4, 7.0, 50.0};
複制
通路數組元素:下标通路法
#include <stdio.h>
int main ()
{
int n[ 10 ]; /* n 是一個包含 10 個整數的數組 */
int i,j;
/* 初始化數組元素 */
for ( i = 0; i < 10; i++ )
{
n[ i ] = i + 100; /* 設定元素 i 為 i + 100 */
}
/* 輸出數組中每個元素的值 */
for (j = 0; j < 10; j++ )
{
printf("Element[%d] = %d\n", j, n[j] );
}
return 0;
}
複制
多元數組
一般就開到兩維,再高也少見。
type name[size1][size2]...[sizeN];
複制
int threedim[5][4]; //第一個大小不能放空
複制
初始化示例:
int a[3][4] = {
{0, 1, 2, 3} ,
{4, 5, 6, 7} ,
{8, 9, 10, 11}
};
複制
也可以這樣:
int a[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};
複制
通路二維數組依舊可以用下标取值法。
數組作為函數參數
void myFunction(int *param) //不懂指針先不急
{
···
}
void myFunction(int param[10])
{
···
}
void myFunction(int param[])
{
···
}
複制
那具體使用該當如何呢?
#include <stdio.h>
double getAverage(int arr[], int size)
{
int i;
double avg;
double sum=0;
for (i = 0; i < size; ++i)
{
sum += arr[i];
}
avg = sum / size;
return avg;
}
int main ()
{
/* 帶有 5 個元素的整型數組 */
int balance[5] = {1000, 2, 3, 17, 50};
double avg;
/* 傳遞一個指向數組的指針作為參數 */
avg = getAverage( balance, 5 ) ;
/* 輸出傳回值 */
printf( "平均值是: %f ", avg );
return 0;
}
複制
由于還沒有涉及到指針,有些操作也不太友善現在寫。
定制輸入輸出函數
我初學C語言的時候寫的代碼,獻醜了。
那時候還不知道寫文檔的重要性,現在這個函數怎麼用我還得看看
這個函數有什麼用呢?為什麼我要特地的放在這裡?
函數功能:
實作一個用于控制輸入輸出的函數,可控範圍包括:
注入長度、接收輸入類型、是否明文輸出等
支援回删,回車結束,esc退出
複制
在我們後面用C語言寫項目的時候會經常用到這個函數,而不是取用預設的scanf,scanf時不時的還會暴雷!!!
是以希望各位小夥伴看完之後可以自行實作一遍,加深印象。
/輸入函數///
void getstr(char str[],int maxLen,int type,int isplainText)
/*
這是一個用于控制輸入輸出的函數,可控範圍包括:
注入長度、接收輸入類型、是否明文輸出
支援回删,回車結束,esc退出
參數釋義:
str[]:用于接收輸入
maxLen:最大輸入長度+1
type:接收輸入類型:0(無所謂)、1(僅數字)、2(僅英文)
isplainText:是否明文輸出:0是1否
*/
{
char ch;
int iLen = 0;
while(1)
{
ch = getch();
if(ch == '\b')
{
if(iLen>0)
{
printf("\b \b");
iLen--;
}
}
if(ch == '\r')
{
str[iLen] = '\0';
break;
}
if (ch == 27)
{
system("cls");
printf("退出成功\n");
exit(1);
}
if(iLen<maxLen-1)
{
switch(type)
{
case 0:
{
if(ch !='\b')
{
if(isplainText == 0)
{
putchar(ch);
}
else
{
putchar('*');
}
str[iLen] = ch;
iLen++;
}
}
break;
case 1:
{
if(ch >= '0' && ch <= '9')
{
if(isplainText == 0)
{
putchar(ch);
}
else
{
putchar('*');
}
str[iLen] = ch;
iLen++;
}
}
break;
case 2:
{
if(ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')
{
if(isplainText == 0)
{
putchar(ch);
}
else
{
putchar('*');
}
str[iLen] = ch;
iLen++;
}
}
break;
}
}
}
}
複制
其實不難看懂,諸位就看文檔吧。