重读《C primer plus》(九)

一、程序示例

示例一

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

简而言之,普通变量把值作为基本量,把地址作为&运算符之后的派生量,而指针变量将地址作为基本量,把值作为通过*运算符获得的派生量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值