软件设计师考试 | 第十二章 软件系统分析与设计 | 算法分析与设计

(一)C程序设计语言与实现

指针是C语言的精华部分,它极大地丰富了C语言的功能。通过利用指针,可以描述复杂的数据机构,在编程时能很好地利用内存资源,使其发挥最大的效率。

1. 指针类型

(1)变量和指针

变量: 是内存单元的抽象。变量具有类型、值、地址、作用域和生存期等属性。

变量的本质是程序中用来存放数据的一段存储空间。一般情况下,变量所对应的存储空间在内存区域,在C语言中程序员可以通过关键字register声明变量的存储单元是CPU中的寄存器。

变量的数据类型不同,它所占的内存单元数也不同。

在访问变量时,首先应找到其在内存的地址。如果在程序中将变量的地址保持在另一个变量中,则形成指针变量,通过指针对所指向变量的访问是一种对变量的“间接访问”。

例如:

定义了两个变量:
整形变量 a 和指针变量 ptr ,
在存取变量 a 中的数据时,
可通过变量 a 或指向变量 a 的指针来进行,
分别称为直接访问和间接访问。
//a是整形变量,其值为整数
int a;
/*
ptr是指针变量,
其值为一个整型变量的地址
*/
int *ptr;

(1)直接访问变量 a 中的数据
a = 5;
a + 10;
(2)简介访问变量 a 中的数据
/*
将变量 a 的地址赋值给指针变量 ptr ,
称 ptr 指向变量 a
*/
ptr = &a;
/*
指针变量 ptr 指向的对象用 *ptr 表示
等价于 a=5; ,
通过指针变量 ptr 访问变量 a
*/
*ptr = 5;

经过上述定义和处理后,变量a和指针变量ptr之间的关系如下图所示:

指针变量ptr与指针变量指向的对象*ptr(a)

(2)通过指针访问数组中的元素

C程序中常利用指针对数组和字符串进行处理。

一个数组由连续的一块内存单元组成,数组名就是这块连续内存单元的首地址(起始地址)。一个数组是由各个数组元素组成的,每个数组元素按其类型不同占有若干个连续的内存单元。

1)指针变量与一维数组

指针变量指向一维数组的方法如下所示:

定义一个整型数组 st 
和指向数组元素的指针 ptr。
//定义包含10个整型数据的数组
int st[10];
/*
定义 ptr 为指向整型变量 st[0] 的指针,
等价于 int *ptr = st
*/
int *ptr = &st[0];

ptr指向数组的第一个元素(即下标为0的元素),则*(p+i)指向数组的第i+1个元素(即下标为i的元素)。

2)指针变量与二维数组

指针变量指向二维数组的情形比较复杂,举例说明:
定义int a[3][4],其元素布局如下图所示:

二维数组a[3][4]元素布局

数组a[3][4]可看作是由3个一维数组(a[0]a[1]a[2])构成的一维数组,每个一维数组的元素是4个。a是二维数组名,它代表整个二维数组的首地址。

a[0]是第0个一维数组的数组名和首地址。*(a+0)*aa[0]是等效的,它们都表示一维数组a[0]0号元素的首地址。&a[0][0]表示a的第0行和第0列元素的首地址。因此,aa[0]*(a+0)*(a+1)&a[0][0]所表示的内容相同。

对于二维数组a[m][n]a+ia[i]*(a+i)&a[i][0]是相同的。

(3)指针与函数

C程序中将指针与函数结合使用的常见方式有函数参数为指针、函数返回值为指针及通过函数指针变量调用函数(函数指针变量)。

1)函数参数为指针

参数使用指针类型的作用是将一个变量的地址传送到另一个函数中。

C语言中实参向形参传值,反之则不行。

例如:

定义函数 swap(a,b)的功能是
交换 a 和 b 的值,代码如下:
void swap(int a,int b){
  int temp;
  temp = a;
  a = b;
  b = temp;
}

如果发生函数调用swap(x,y),则系统将x的值传给ay的值传给b,在函数中实现了ab的值的交换,但是xy的值并没有发生交换。

为实现将函数中对形参的修改结果返回给调用函数,可使用指针参数。

对上个例子进行修改,代码如下:

void swap_1(int *a,int *b){
  int temp;
  temp = *a;
  *a = *b;
  *b = temp;
}

当形参为指针类型时,传递给形参的应该是地址信息,因此调用swap_1的形式为swap_1(&x,&y)。这样通过“间接访问”,实现了在被调用函数中修改实参所对应的变量。

2)函数返回值为指针

函数类型是指函数返回值的类型。返回指针的函数称为指针型函数。需要注意的是,不能返回局部数据的指针。

例如下面的函数,函数get_str虽然返回了局部数组str的首地址,但调用get_str的其他函数并不能通过此地址访问字符串testing local pointer

char* get_str(void){
  char str[] = {"testing local pointer"};
  return str;
}

int main(){
  char *p;
  int i;
  p = get_str();
  for(i = 0; *(p+i); i++)
    putchar(*(p+i));
  return 0;
}

将函数get_str中的char str[] = {"testing local pointer"};改成char *str = {"testing local pointer"};即可。

3)指针变量

程序中的一个函数总是占用一段连续的内存区,而函数名就是该函数所占内存区的首地址。可以把函数的首地址(或称入口地址)赋给一个指针变量,使指针变量指向该函数,然后通过指针变量就可以找到并调用这个函数。

指针函数的指针变量称为“函数指针变量”。

函数指针变量定义的一般形式为:

类型说明符 (*指针变量名)();

其中,“类型说明符”表示被指明函数的返回值的类型;“(*指针变量名)”表示*后面的变量是指针变量;最后的一对空括号表示指针变量所指向的对象是一个函数。

例如,下面定义了一个函数指针变量funptr

int (*funptr)();

2. 指针与数据结构

随着软件开发环境的不断完善和程序语言的抽象程度不断提高,数据结构的内部设计细节被封装和屏蔽起来,在很多应用软件的开发中没有必要也不再涉及底层细节,但是在系统级程序设计或嵌入式应用的软件设计中,指针及相关机制的应用仍然是十分必要的。


(二)算法设计与实现

1. 算法设计过程

  1. 理解问题
  2. 确定相关因素
    预测所有可能的输入,在精确解和近似解之间做选择,确定适当的数据结构,确定算法设计技术。
  3. 设计算法
  4. 证明算法的正确性
  5. 分析算法的效率
  6. 根据算法编写代码

2. 算法问题类型

  • 查找问题
  • 排序问题
  • 图问题
  • 组合问题
  • 几何问题

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容