内容正文:
第七章 程序的性能优化--指针
1
CONTENTS
目录
01
02
为什么使用指针
什么是指针
03
指针变量的应用
04
指针变量的运算
05
使用指针访问一维数组中的元素
CONTENTS
目录
06
07
字符型指针引用字符串
使用指针访问二维数组中的元素
08
指针数组与指针的指针
09
使用指针作为函数的参数
10
使用指针作为函数的返回值
11
使用指针调用函数
C语言
知识树
My First Template
字符型指针引用字符串
C语言程序设计
5
C语言
字符型指针引用字符串
字符型指针引用字符串
访问一个字符串,可以通过两种方式:
一种是在数组章节中所学的使用字符数组来存放和操作一个字符串,通过数组名和下标引用一个字符,或者通过数组名和格式声明“%s”输入或输出该字符串;
另一种方式就是即将要学习的利用字符指针引用一个字符串,在这种方式下,不需要定义字符数组,也就不需要提前划定一片连续的存储空间,而是用多少占多少。
My First Template
C语言
本次任务
使用字符型指针保存一个字符串的首地址,并输出该字符串
字符型指针引用字符串
My First Template
C语言
任务实现
#include "stdio.h"//预处理
void main() //主函数
{
char *string="
纸上得来终觉浅,绝知此事要躬行。
";
printf("%s",string);
}
程序中没有定义字符数组,只定义了一个字符指针变量,并使用字符串常量对它进行了初始化。但事实上C语言程序仍然会在内存的常量区中开辟一个字符数组的空间来存放这个字符串常量,只不过该字符数组没有定义名字,只能通过字符指针变量来引用,字符指针变量里存放的就是这个字符数组的首地址。字符指针变量的初始化,也可以写成两句,注意第二句string前不应该有“*”号。
char *string;
string="
纸上得来终觉浅,绝知此事要躬行。
";
字符型指针引用字符串
My First Template
C语言
本次任务
利用字符指针复制字符串
字符型指针引用字符串
My First Template
C语言
任务实现
#include "stdio.h"//预处理
void main() //主函数
{ char str1[]="行是知之始,知是行之成。";
char str2[50];
char *p1,*p2;
for(p1=str1,p2=str2;*p1!='\0';p1++,p2++)
*p2=*p1;
*p2='\0';
printf("原字符串是:%s
",str1);
printf("复制字符串:%s
",str2);
}
说 明1:将字符指针p1和p2分别指向两个字符数组的首地址。将第一个字符数组的元素赋值给第二个字符数组的元素,之后两个字符指针分别向后跳跃一个字符元素,直到第一个字符指针指向字符串结束标志'\0'为止。
说 明2:字符数组与字符指针变量不同之处在于,指针变量的值是可以改变的,而数组名是一个常量,不可以改变。可以移动字符指针指向数组中的任何位置,却不能移动数组本身的位置。
字符型指针引用字符串
My First Template
指针数组与指针的指针
C语言程序设计
11
C语言
指针数组
指针数组与指针的指针
一个数组的元素均为指针类型的数据,就是指针数组。换句话说,指针数组中每一个元素都相当于一个同类型的指针变量,用来存放一个地址。
类型名 *数组名[数组长度];
例 如:
int *p[4];
说 明:此句表示的是声明一个含有四个元素的数组p,每一个元素都是一个指向整型数据的指针。
我们经常使用指针数组来指向一个二维数组,即指针数组的每一个元素指向二维数组的每一行首地址,也就是指向一个一维数组。而这种应用特别适合指向若干个字符串。
My First Template
C语言
本次任务
已知5本图书的名称,将他们排序后输出
指针数组与指针的指针
My First Template
C语言
任务实现
#include "stdio.h"//预处理
#include "string.h"
void main()
{ char *book[5]={"程序设计基础","计算机组成原理","汇编语言","编译原理","数据结构"};
char *temp;
int i,j;
for(i=0;i<4;i++)
//使用选择法将指向字符串的指针进行排序
{ for(j=i+1;j<5;j++)
if(strcmp(book[i],book[j])>0) //字符串比较函数
{
temp=book[i];
book[i]=book[j];
book[j]=temp;
}
}
for(i=0;i<5;i++)
printf("%s
",book[i]);
}
指针数组与指针的指针
My First Template
C语言
任务分析与总结
字符串数组初始化
字符串数组排序后
使用选择法通过strcmp函数对字符串进行了比较和排序。但是请注意在排序时,交换和移动的并不是字符串,而是指向字符串的指针。假如交换的是字符串,那么因为字符串长度各不相同,需要先定义一个足够宽度的二维字符数组来存放这几个字符串,这样无形中增加了存储空间的浪费,而且交换字符串需要进行字符串的复制,程序执行速度就会变慢。
指针数组与指针的指针
My First Template
C语言
指针的指针
指针数组与指针的指针
指针数组的数组名代表了该指针数组所有元素的首地址。前面的实例中的book数组。book代表了book[0]这个字符指针的地址,book+i就代表了book[i]的地址,*(book+i)则代表book[i]的值。假如设一个指针变量p,用它指向book数组中的元素,那么p就是一个指向指针的指针
指针变量可以指向整型变量、实型变量、字符型变量,当然也可以指向指针变量。我们定义一个指针的指针,语法是:
类型名 **指针变量名;
My First Template
C语言
指针的指针
指针数组与指针的指针
例如1:
char **p;
说 明:p代表一个指向“指向字符型数据指针”的指针。这个写法相当于“char *(*p);”。
如果我们要初始化p,以指针数组实例中的字符数组为例,我们可以为p进行如下赋值:
p=book; //p指向book[0]
p=&book[1]; //p指向book[1]
p=book+3; //p指向book[3]
例如2:
int i=15;
int *p1=&i;
int **p2=&p1;
说 明:这几句含义是,声明了一个整型变量i并初始化赋值15;接下来声明了一个指向整型变量的指针p1,并将它指向变量i;再声明了一个指向“指向整型变量的指针”的指针p2,并将它指向p1。如图7. 17所示。引用变量i,可以是*p1,也可以是**p2。
My First Template
C语言
任务实现
#include "stdio.h" //预处理
void main()
{
char *book[5]={"程序设计基础","计算机组成原理","汇编语言","编译原理","数据结构"};
char **p; //定义指向字符型指针的指针
for(p=book;p<book+5;p++)
{
printf("%s
",*p);
}
}
指针数组与指针的指针
My First Template
C语言
任务实现
#include "stdio.h" //预处理
void main()
{
char *book[5]={"程序设计基础","计算机组成原理","汇编语言","编译原理","数据结构"};
char **p; //定义指向字符型指针的指针
for(p=book;p<book+5;p++)
{
printf("%s
",*p);
}
}
指针数组与指针的指针
指针p指向字符指针数组的第一个元素book[0],而book[0]也就是*p是第一个字符串“程序设计基础”的首地址。我们用格式字符“%s”输出*p即可
My First Template
$$