C語言基礎語言總結(二)

  • C函數

定義函數的一般形式:

return_type function_name(parameter list)
{
	body of the function
}

return_type:返回類型,有些函數執行所需的操作而不返回值,在這種情況下,return_type是關鍵字void

function_name:函數名稱,函數名和參數列表一起構成了函數簽名

parameter list:參數列表,參數就像佔位符。當函數被調用時,向參數傳遞一個值。參數列表包括函數參數的類型、順序、數量

body of the function:函數主體包含一組定義函數執行任務的語句
求倆個數大小實列:

#include<stdio.h>

int max(int num1,int num2)
{
	/*局部變量聲明*/
	int result;
	if (num1>num2)
		result=num1;
	else
		result=num2;
	return result;
}

函數聲明
函數聲明會告訴編譯器函數名稱及如何調用函數。函數的實際主體可以單獨定義

在一個源文件中定義函數且在另一個文件中調用函數時,函數聲明是必需的。在這種情況下,應該在調用函數的文件頂部聲明函數

調用函數
當程序調用函數時,程序控制權會轉移給被調用的函數。被調用的函數執行已定義的任務,當函數的返回語句被執行時,或到達函數的結束括號時,會把程序控制權交還給主程序

例如:

#include<stdio.h>

int mian()
{
	/*局部變量聲明*/
	int a=100;
	int b=200;
	int ret;
	
	/*調用函數來獲取最大值*/
	ret = max(a,b);
	printf("Max value is : %d\n",ret);
	return 0;
}

/*函數返回兩個數中較大的那個數*/
int max(int num1,int num2)
{
	int result;
	if(num1>num2)
		result = num1;
	else
		result = num2;
	return result;
}

函數參數
如果函數要使用參數,則必須聲明接受參數值的變量。這些變量稱爲函數的形式參數

形式參數就像函數內部的其他局部變量,在進入函數時被創建,退出函數時被銷燬

兩種向函數傳遞參數的方法

  1. 傳值調用
    把參數的實際值複製給函數的形式參數。在這種情況下,修改函數內的形式參數不會影響實際參數
    實例:
void swap(int x,int y)
{
	int temp;
	temp = x;
	x = y;
	y = temp;
	return;
}

通過傳遞實際參數來調用函數swap():

#include<stdio.h>
void swap(int x,int y);
int main()
{
	int a =100;
	int b =200;
	printf("交換前a的值:%d",a);
	printf("交換前b的值:%d",b);
	swap(a,b);
	printf("交換後a的值:%d",a);
	printf("交換後b的值:%d",b);
	return 0;
}

上面的代碼被編譯執行後,結果如下:

交換前a的值:100
交換前b的值:200
交換後a的值:100
交換後b的值:200

雖然在函數內部改變了a和b的值,但實際上a和b的值沒有發生變化

  1. 引用調用
    形參爲指向實參地址的指針,當對形參的指向操作時,就相當於對實參本身進行的操作

    傳遞指針可以讓多個函數訪問指針所引用的對象,而不是把對象聲明爲全局可訪問

void swap(int *x,int *y)
{
	int temp;
	temp = *x;
	*x = *y;
	*y = temp;
	return ;
}

通過引用傳值來調用swap():

#include<stdio.h>

void swap(int *x,int *y)
int main()
{
	int a = 100;
	int b = 200;
	printf("交換前a的值:%d",a);
	printf("交換前b的值:%d",b);
	swap(&a,&b);
	printf("交換後a的值:%d",a);
	printf("交換後b的值:%d",b);
	return 0;
}

編譯執行後,結果爲:

交換前a的值:100
交換前b的值:200
交換後a的值:200
交換後b的值:100
  • C作用域規則

作用域是程序中定義的變量所存在的區域,超過該區域變量就不能被訪問。c語言中有三個地方可以聲明變量:
1.在函數或內部的局部變量
2.在所有函數外部的全局變量
3.在形式參數的函數參數定義中

局部變量
在某個函數或塊的內部聲明的變量,它們只能被該函數或該代碼塊內部的語句使用
局部變量保存在棧中,只有在 所在函數被調用時才動態地爲變量分配存儲單元。局部變量被定義時,系統不會對其初始化

全局變量
全局變量定義在函數的外部,通常是在程序的頂部。全局變量在整個程序生命週期內都要效,在任何的函數內部都能訪問全局變量
全局變量保存在內存的全局存儲區中,佔用靜態的存儲單元

形式參數
函數的參數,形式參數,被當作該函數內的局部變量,如果與全局變量同名它們會優先使用

  • C數組

數組數據結構,它可以存儲一個固定大小相同類型元素的順序集合。

聲明數組
要聲明一個數組,需要指定元素的類型和元素的數量

type arrayName [ arraySize]

這叫一維數組。arraySize必須是一個大於0的整數常量,type可以是任意有效的c數據類型。

初始化數組

double balance[5]={1000.0,2.0,3.4,7.0,5.6}

大括號之間的值得數目不能大於方括號中指定得元素數目

所有的數組都是以0作爲它們第一個元素的索引,也被稱爲基索引

訪問數組元素
數組元素可以通過數組名稱加索引進行訪問

double salary = balance[9]

聲明數組、數組賦值、訪問數組實例:

#include<stdio.h>

int main()
{
	int n[10];
	int i,j;
	for (i = 0 ; i < 10 ; i ++)
	{
		n [ i ] = i + 100;
	}
	for (j = 0 ; j < 10 ; j++)
	{
		printf("Element[%d] = %d\n",j,n[j])
	}
	return 0;
}

多維數組
聲明形式:

type name[size1][size2]...[sizeN];

二維數組,在本質上是一個一維數組的列表。聲明一個x行y列的二維數組

type arrayName[x][y];

初始化二維數組:

int a[3][4] = {
{0,1,2,3},   /* 初始化索引號爲0的行 */
{4,5,6,7},   /* 初始化索引號爲1的行 */
{8,9,10,11}   /* 初始化索引號爲2的行 */
};

內部嵌套的括號是可選的,可以去掉

傳遞數組給函數
下面這個函數,它把數組作爲參數,同時還傳遞了另一個參數,根據所傳的參數,會返回數組中各元素的平均值

#include<stdio.h>

double getAverage(int arr[],int size);

int mian()
{
	int balance = {1000.0,2,3,17,50};
	double avg;
	
	avg = getAverage(balance,5);
	printf("平均值是:%f",avg);
	return 0;
}

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;
}

從函數返回數組
c語言不允許返回一個完整的數組作爲函數的參數,但是可以通過指定不帶索引的數組名來返回一個指向數組的指針

如果想要從函數返回一個一維數組,必須聲明一個返回指針的函數

int * myFunction()
{
...
}

C語言不支持在函數外部返回局部變量的地址,除非定義局部變量爲static變量

下面的函數,它會生成10個隨機數,並使用數組來返回它們

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

/* 要生成和返回隨機數的函數 */
int * getRandom()
{
	static int r[10];
	int i;
	/* 設置種子 */
	srand( (unsigned)time(NULL) );
	for ( i=0 ; i<10 ; ++i)
	{
		r[i] = rand();
		printf("r[%d] = %d\n",i,r[i]);
	}
	return r;
}

/* 調用上面定義函數的主函數 */
int main()
{
	/* 一個指向數組的指針 */
	int *P;
	int i;
	p = getRandom();
	for ( i=0 ; i<10 ; i++)
	{
		printf("*(p + %d) : %d\n",i,*(p+i));
	}
	return 0;
}

指向數組的指針
數組名是一個指向數組中第一個元素的常量指針。因此,*(balance+4)是一種訪問balance[4]數據的合法方式

一旦把第一個元素的地址存儲在p中,就可以使用p、p+1、*(p+2)等來訪問數組元素

#include<stdio.h>

int mian()
{
	double balance[5] = {1000.0,2.0,3.4,17.0,5.6};
	double *p;
	int i;

	p = blance;
	printf("使用指針的數組值\n");
	for ( i = 0; i < 5; i++ )
	{
		printf("*(p + %d) : %f\n",i,*(p+i));
	}
	printf("使用balance作爲地址的數組值\n");
	for ( i = 0; i < 5; i++ )
	{
		printf("*(balance + %d) : %f\n",i,*(balance+i));
	}
	return 0;
}

上面的實例中,p是一個指向double型的指針,這意味着它可以存儲一個double類型的變量。一旦有了p中的地址,*p將給出存儲在p中相應地址的值

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