C语言学习笔记(后半部分)

本文用于学习C语言,备考计算机二级C语言考试,课程需要及个人兴趣所向,欢迎学习指正,持续更新


前言

本次学习内容为数组、函数、指针、编译预处理和动态存储分配、结构体和共用体、文件


一、数组

1. 一维数组

一个数组元素实际上是一个变量名,代表内存中的存储单元,一个数组占据的是一个连续的存储单元。

int a[10];//a[0],a[1]等都是变量名字,但是存储空间是连续的(不同于链表是不连续的)
int b[3] = {
    
    0,1,2};//花括号
int c[5] = {
    
    0,1};//后面的元素自动补0,此时c[5] = {0,1,0,0,0}
int d[] = {
    
    0,1,2,3,4};//此时数组大小为5,相当于d[5]

2.二维数组

先存储第一行的元素,再存储后面行的元素;
可以省略第一行方括号中的常量表达式的,但不能省略第二行的。

int a[2][3] = {
    
    {
    
    1,5},{
    
    4,7,8}};
int b[][4] = {
    
    {
    
    1,2},{
    
    4,4}};//合法的,其中第一行常量为2,第二行自动补0
/* int c[5][];不合法的 */ 

3.字符数组

与上同,不同的是自动补'/0'空字符,且C语言中字符串视为字符数组,结尾有字符串结束标志'/0'

#include "stdio.h"
#include "string.h"

void main()
{
    
    
    char a[] = {
    
    'h','w','j'};
    char b[5];
	gets(b);//从终端输入一个字符串
    puts(b);//输出字符串b[5]
    strcpy(a,b);//用字符串b的元素覆盖字符串a[],长度也可覆盖,函数返回值为字符数组a[3]的首地址
    //puts(a);
    strcat(a,b);//拼接a、b,函数返回值为字符数组a[3]的首地址
    int length_s = strlen(a);//返回字符串长度、
    int bool_s = strcmp(a,b);//比较a,b所指字符串大小,a>b则返回正数,a<b则返回0
}

二、函数

1、函数概述

C语言中除主函数外的子程序都是由函数实现的。一个C程序只能有一个主函数,由主函数调用其他函数,其他子函数之间可以相互调用;
C程序的执行总是从main()函数开始,调用其他函数执行完毕后回到main()函数,继续执行main()中的程序,直到main()函数运行结束则整个程序结束。

函数分类如下
1、标准函数,即库函数
2、自定义函数(有参函数、无参函数)

2、函数的参数及返回值

形式参数和实际参数

1、定义函数时,函数名后圆括号中的变量为”形式参数“(”形参“);
2、在主调函数中,函数后面圆括号中参数为”实际参数“(”实参)。

例如:

#include "stdio.h"

//全局变量,全局可用
int b = 0;
void main()
{
    
    
    //局部变量,只可在函数内使用
    int a = 0//声明函数
	void function1(x);
    void function2(y);
    //调用函数
    function1(a); //实际参数
    function2(b); //实际参数
    //打印结果
    printf("%d & %d", a,b);
}

//定义函数
void function1(int x) //形式参数
{
    
    
	x += 12138;
}
void function2(int y) //形式参数
{
    
    
	b += 12138;
}

输出:0 & 12138

其中x,y为形参,形参用于将实参的值传入函数,后续形参的改变不会影响实参的值,如本例中的function1。
本例中a为全局变量,b为局部变量

函数的返回值
调用函数后返回主调函数一个确定的值,定义函数为void类型则可以无返回值;
例如:

#include "stdio.h"

void main()
{
    
    
	int a = 0;
	//声明函数
	int fun(int x);
	a = fun(a);
	printf("a = %d", a);
}
int fun(int x)
{
    
    
	x = x+1;
	return x;//将x的值传回主调函数
}

输出:a = 1

return类型必须和函数定义时的类型保持一致,否则以函数类型为准进行强制转换

3、函数的调用

由上面两个例子可以看出,一般调用函数之前需要声明函数

函数声明

若函数定义在调用之前,则调用时无需声明,反之则必须声明;
声明形式:类型名 函数名(参数类型1,参数类型2 ,…)或加上参数名
例如: int fun(int); 或 int fun(int x);

嵌套调用与递归调用

嵌套调用:函数里再调用别的函数;
递归调用:函数里再调用自己。

4、函数中变量的存储类别

1、auto变量:所定义的变量为自动类别,存储在内存,占用内存单元;
2、register变量:所定义的变量为自动类别,存储在寄存器,不占用内存单元;
3、static变量:同上,静态局部变量,该变量内存不会释放,每次进入函数都使用相同位置的存储空间,在编译时赋予初值,执行时不再赋予。


三、指针

更新于2022.10.15

猜你喜欢

转载自blog.csdn.net/huangweijie0426/article/details/127292754