一、定义函数
注
函数名就是函数的地址
eg:函数名 == &函数名
函数的声明
1.定义的函数放到main之前,可直接使用。
int max(int x,int y)
{...}
main()
{...}
2.定义的函数放到main之后,需在main中声明该定义的函数。
格式为:extern+函数类型+函数名(参数)
main()
{
extern int max(int)或者extern int max(int x,int y)或者int max(int x,int y) //声明部分
...}
int max(int x,int y)
{...}
利用头文件和源文件放定义函数
在源文件放入函数的定义,在头文件放入对函数的声明。
example:
//在源文件中添加add.c的项,写下该函数的定义
int add(int x, int y)
{
return (x + y);
}
//在头文件中添加add.h的项,写下对该函数的引用
extern int add(int);
//在main函数中先写出#include"add.h"
//然后就可以直接使用add(a,b)函数
将所写的定义函数移植到新项目
将函数的头文件和源文件单独留在项目中进行生产静态库文件
将静态库文件拷贝至想要移植的项目目录下,同时在新项目中添加已有项(移植函数的头文件)
#pragma comment(lib,"test")
//引入静态库
example(移植后在新项目中的使用情况)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#pragma comment(lib,"test")
void main()
{
int a = 100,b = 20;
printf("%d", add(a, b));
}
函数的嵌套调用
利用递归计算1!+2!+3!+...+n!的结果_HS-Cai的博客-CSDN博客https://blog.csdn.net/qq947467490/article/details/126875715
函数的链式访问
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void main()
{
char arr1[]="Hello World";
char arr2[20]={0};
printf("%s", strcpy(arr2, arr1));
}
//strcpy返回值为数组指针类型
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void main()
{
printf("%d",printf("%d", printf("%d", printf("%d", 43))));
}
//printf返回类型为整型,其数值代表打印的数量
二、*函数传参(函数压栈)
实参和形参
实际参数(实参):
真实传给函数的参数,叫实参。实参可以是︰常量、变量、表达式、函数等。无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形参实化之后其实相当于实参的一份临时拷贝
形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
但可以利用指针对main里的变量进行赋值
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void exchange(int* pa, int* pb)
{
int z = *pa;
*pa = *pb;
*pb = z;
}
void main()
{
int a = 19, b = 199;
printf("交换前a=%d b=%d", a, b);
exchange(&a, &b);
printf("交换后a=%d b=%d", a, b);
}
栈
一种数据结构——先进的后出,后进的先出
函数对参数的压栈-涉及到函数栈帧的创建与销毁
三、数组
定义
实例
注:
若是所分配内存中的元素值的赋值未赋满即不完全初始化,其未赋值的元素值分为两种情况。
(1)在全局变量下
未赋值的元素值均为0
(2)在局部变量下
未赋值的元素值为随机值(依赖于编译器和系统)
指针运用数组
arr[0] = *arr;
arr[n] = *(arr + n);
void main()
{
int arr[5];
int* p = arr;
for (int i = 0; i < 5; ++i)
{
*p = i;
printf("%d ", *p);
++p;
}
}
//输出结果为0 1 2 3 4
注:当数组以形参传到函数内部时,是无法计算元素个数的。
二维数组
二维数组的创建
int arr[3][4];
//第一个[]代表行,第二个[]代表列
二维数组的格式化
int arr[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
从第一行开始按照元素从左到右依次格式化完四个元素然后再进入第二行格式化如此进行
int arr[3][4] = { {1,2},{3,4},{5,6} };
//{}内部为行内元素
未完全格式化的位置均以0填充
int arr[][4] = {{1,2},{3,4},{5,6}};
格式化二维数组中,行数可以不指定,列数必须指定。
打印二维数组
void main()
{
int arr[3][4] = { {1,2},{3,4},{5,6} };
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 4; ++j)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void main()
{
int arr[3][4] = { {1,2},{3,4},{5,6} };
int* p = arr;
for (int i = 0; i < 12; ++i)
{
printf("%d ", *(p + i));
if ((i + 1) % 4 == 0)
printf("\n");
}
}
//利用地址打印二维数组