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中相应地址的值

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