文章目录
一、程序示例
示例一
//lethead1.c
#include<stdio.h>
#define NAME "GIGATHINK, INC."
#define ADDRESS "101 Megabuck Plaza"
#define PLACE "Megapolis, CA 94904"
#define WIDTH 40
void starbar(void);
int main()
{
starbar();
printf("%s\n",NAME);
printf("%s\n",ADDRESS);
printf("%s\n",PLACE);
starbar();
return 0;
}
void starbar(void)
{
int count;
for(count = 1;count <= WIDTH; count++)
putchar('*');
putchar('\n');
}
此程序中只是单纯地打印了星号,并没有涉及任何参数的传递,而参数地传递会让我们函数的发挥更进一步。
示例二
//lethead2.c
#include<stdio.h>
#include<string.h>
#define NAME "GIGATHINK,INC."
#define ADDRESS "101 Megabuck Plaza"
#define PLACE "Megapolis,CA 94904"
#define WIDTH 40
#define SPACE ' '
void show_n_char(char ch,int num);
int main(void)
{
int spaces;
show_n_char('*',WIDTH);
putchar('\n');
show_n_char(SPACE,12);
printf("%s\n",NAME);
spaces = (WIDTH - strlen(ADDRESS))/2;
show_n_char(SPACE,spaces);
printf("%s\n",ADDRESS);
show_n_char(SPACE,(WIDTH- strlen(PLACE))/2);
printf("%s\n",PLACE);
show_n_char('*',WIDTH);
putchar('\n');
return 0;
}
//函数show_n_char()的定义
void show_n_char(char ch,int num)
{
int count;
for(count = 1;count <= num; count++)
{
putchar(ch);
}
}
运行结果如下;1[Alt]
实际参数和形式参数
形式参数是函数定义的函数头文件中声明的变量。实际参数是出现在函数调用圆括号中的表达式。
黑盒视角
main主调函数与其他函数中的变量相互独立、互不影响。
使用return从函数中返回值
函数类型
二、ANSI C函数原型
为了解决参数类型和个数不匹配问题,所以提出函数原型的解决方案,即
int imax(int,int);
int imax(int a ,int b);
其优点可以让编译器捕获在使用函数时可能出现的许多错误或疏漏。
三、递归
C语言允许函数调用它自己,这便称为递归,结束递归是使用递归的难点
示例三
//recur.c
#include<stdio.h>
void up_and_down(int);
int main(void)
{
up_and_down(1);
return 0;
}
void up_and_down(int n)
{
printf("Level %d : n location %p\n",n,&n);
if(n<4)
up_and_down(n+1);
printf("LEVEL %d: n location %p\n",&n);
}
尾递归
递归和倒序计算
要求:写一个函数,可以打印与一个整数的二进制数。
代码实现:
//binary.c
#include<stdio.h>
void to_binary(unsigned long n);
int main()
{
unsigned long number;
printf("Enter an integer (q to quit):\n");
while (scanf("%lu",&number) == 1)
{
printf("Binary equivalent: ");
to_binary(number);
putchar('\n');
printf("Enter an integer (q to quit):\n");
}
printf("Done.n");
return 0;
}
void to_binary(unsigned long n)
{
int r;
r = n % 2;
if(n >= 2)
{
to_binary(n / 2);
putchar(r == 0 ? '0' : '1');
return;
}
}
//代码貌似有点小小的bug,待我闲暇时刻慢慢研究。
C语言中一切函数都是平等的,main函数有点特殊,但是也没有多么优先的地位。
四、编译多源代码文件的程序
1.UNIX
UNIX C编译器cc已经停用,现在起了别名用作其他编译器命令,典型的有gcc或者clang。生成 .o 目标文件和 .out 可执行文件。
2.Linux
可以生成 __.out__可执行文件。
3.DOS命令行编译器
与UNIX中cc编译器类似,生成文件扩展名为 .obj。
4.Windows和苹果的IDE编译器
面向项目,项目描述的是特定程序使用的资源。
5. 使用头文件
五、查找地址:&运算符
==指针(pointer)shiC语言中最重要的(有时候也是最复杂的)概念之一,用于存储变量的地址。
六、更改主调函数中的变量
七、指针简介
1.间接运算符:*
与指针有关的运算符
- 地址运算符:&
- 间接运算符:*
2.声明指针
*p为基本形式
3.使用指针在函数间通信
程序示例
//swap.c
#include<stdio.h>
void interchange(int * u ,int * v);
int main()
{
int x = 5;
int y = 10;
printf("Originally x = %d and y = %d.\n",x,y);
interchange(&x,&y);
printf("Now x = %d and y = %d.\n",x,y);
return 0;
}
void interchange(int * u,int * v)
{
int temp;
temp = *u;
*u = *v;
*v = temp;
}
简而言之,普通变量把值作为基本量,把地址作为&运算符之后的派生量,而指针变量将地址作为基本量,把值作为通过*运算符获得的派生量。