《C和指针》学习笔记
第七章
7.4 ADT
其实我之前在对C语言的学习中很少会涉及到抽象数据类型(ADT),这个一般在C++语言的学习中会涉及到抽象数据类型的设计。这本书里面也提到了C的抽象数据类型的设计。
C语言中利用 static关键词的合理使用来限制对模块的访问。这里有个例子来说明模块的一种可能的实现方法。
addrlist.h
#define NAME_LENGTH 30
#define ADDR_LENGTH 100
#define PHONE_LENGTH 11
#define MAX_ADDRESSES 1000
char const *lookup_address(char const *name);
char const *lookup_phone(char const *name);
addrlist.c
#include "addrlist.h"
#include <stdio.h>
static char name[MAX_ADDRESSES][NAME_LENGTH];
static char address[MAX_ADDRESSES][ADDR_LENGTH];
static char phone[MAX_ADDRESSES][PHONE_LENGTH];
static int find_entry(char const *name_to_find)
{
int entry;
for (entry = 0; entry < MAX_ADDRESSES; entry+=1)
if (strcmp(name_to_find,name[entry])==0)
return entry;
return -1;
}
char const * lookup_address(char const * name)
{
int entry;
entry = find_entry(name);
if (entry == -1)
return NULL;
else
return address[entry];
}
char const * lookup_phone(char const * name)
{
int entry;
entry = find_entry(name);
if (entry == -1)
return NULL;
else
return phone[entry];
}
7.5 递归
C中是通过运行时堆栈支持递归函数的实现。递归函数 就是直接或者间接的调用自己的函数。
#include <stdio.h>
void binary_to_ascii(unsigned int value)
{
unsigned int quotient;
quotient = value / 10;
if (quotient != 0)
binary_to_ascii(quotient);
putchar(value % 10 + '0');
}
追踪一个递归函数执行过程的关键是理解函数中所声明的变量是如何存储的。当函数被调用时,它的变量的空间是创建与运行时堆栈上的。以前被调用的函数的变量仍保存在堆栈上,但它们被新函数的变量所覆盖,因此是不能被访问的。
递归调用语句本身在前面没有结束递归的过程时,效果类似与循环,但是递归调用会保存一些信息,也就是保存在堆栈里面的变量值。
7.6 可变参数列表
有的函数的参数列表包含可变的参数数量和类型,它们可以用stdarg.h 头文件所定义的宏来实现。参数列表的可变部分位于一个或多个普通参数的后面,在函数原型中用省略号表示。