Transcript Document

第45讲 指针数组和指向指针的
指针
一、指针数组



指针数组的概念:一个数组,其元素均为指针类型数
据,称为指针数组。即指针数组中的每个元素都是指
针变量。
指针数组的定义:
类型名 *指针数组名[常量表达式]
① *表示说明的是指针数组;
② 类型名说明指针数组元素所指向的数据的类型;
③ 常量表达式说明指针数组元素的个数(数组长度)。
如:int *ap[3];
表示ap是一个数组,有3个元素,每个元素都是指向
整型数据的指针变量。
指针数组的主要用途是使指针数组的各元素分别指向
长度不等的字符串的首字符。
赋值:
若有定义:int a[10], b[15], c[20], *p[3];
则可以赋值:p[0]=a;
p[1]=b;
p[2]=c;
然后就可以通过*(p[0])、*(p[1])、*(p[2])访
问数组a、b、c的第0个元素;
可以通过*(p[0]+i)、*(p[1]+i)、*(p[2]+i)访问
数组a、b、c的第i个元素;

若有定义:char *sp[ ]={"CPU", "Computer",
"Microprocessor"};
则:
sp[0]=“CPU”;
sp[1]="Computer";
sp[2]="Microprocessor";


若用二维数组实现:char sp[ ][15]={"CPU",
"Computer", "Microprocessor"};
?
15
利用二维数组存放各行长度不等的数据相比,利用指针
数组可以减少占用的存储空间。
二、指向指针的指针



概念:一个指针变量p中存放的是另一个变
量的地址;如果将指针变量p的地址存放到
另一个指针变量q中,则指针变量q称为指
向指针的指针变量。
定义:
类型名 **指针变量
例:int x, *p, **q;
则可以做这样的赋值:p=&x; q=&p;
指向指针的指针主要用于访问指针数组或在函数间传递指针数组。
static char *str[5]={"C language", "Basic", "Great Wall", "Fortran", "Computer
Design"};
char **p;
含义为:str是指针数组,其元素(str[i])是指针型数据(指向字符串中的首字
符),它们的值为地址,且每个元素在内存中有相应的地址。
数组名str是数组的首地址,str表示str[0]的地址(&str[0]),str+i表示元
素str[i]的地址(&str[i])。
从数据类型来看,str、str+i是指向指针型数据的指针。
p=str;
//p指向str数组的第0号元素;
*p=str[0];
printf("%s", *p);
// 输出C Language
p=str+2;
printf("%s", *p);
// 输出Great Wall
p=str;
printf("%s", *(p+1) );
// 输出str[1]所指向的字符串
printf("%c", *(*(p+1)+2)); // 输出指针数组str中元素str[1]所指向字符串中
的第3个字符's'
注意:*(p+1)可表示为p[1]
*(*(p+1)+2)可表示为p[1][2]、*(p[1]+2)、(*(p+1))[2]
指针数组做main函数的参数
main函数可以带两个形式的参数:
main(int argc, char *argv[ ])
或:main(int argc, char **argv)
main(int argc, char argv[ ][ ])
说明:



形参名可以使用其它名字,但通常习惯上起名argc和
argv;
main函数可以不带参数;如果带参数则只能写成如上
形式。
对于DOS命令:copy file1 file2
则:argc为3
*argv(即argv[0])指向字符串"copy"
*(argv+1)(即argv[1])指向字符串"file1"
*(argv+2)(即argv[2])指向字符串"file2"
利用argv[i][j]等形式可以得到第i个字符串
的第j个字符
例1 显示多个字符串
①、利用指针数组实现
#include <stdio.h>
void main( )
{
static char *ap[3]={"CPU", "Computer", "Microprocessor"};
int i;
for (i=0; i<3; i++)
puts(ap[i]);
}
②、利用二维数组实现
#include <stdio.h>
void main( )
{
static char aa[3][15]={"CPU", "Computer", "Microprocessor"};
int i;
for (i=0; i<3; i++)
puts(aa[i]);
}
例2 使用指向指针的指针变量输出字符串。
#include <stdio.h>
int main()
{
char *name[]={"Follow me",
"BASIC","Great Wall",
"FORTRAN",
"Computer design"};
char **p;
int i;
for(i=0;i<5;i++)
{
p=name+i;
printf("%s\n",*p);
}
}
例3 输出命令行的每个参数(注意程序的运行方法)。
#include <stdio.h>
int main(int argc, char *argv[])
{
int i;
for(i=1;i<argc;i++)
printf("%s%c\n",argv[i],(i<argc-1)?' ':'\n');
return 0;
}
三.练习题
1、编写程序,定义一个指针数组,各元素分
别初始化为一个星期中的星期名。输入星
期,输出该日期的英文名。如输入3,则输
出Wednesday。
2、编写程序,输入月份号,输出该月的英文
名。如输入3,则输出March。要求用指针
数组实现。