cout<
}
运行结果:
CLanguageCLanguage
也可以不定义字符数组,而直接用一个指针变量指向一个字符串常量。
如:
voidmain()
{
char*p=”CLanguage”;
cout<
}
程序中虽然没有定义数组,但字符串在内存中是以数组形式存放的。
它有一个起始地址,占一片连续的存储单元,并以“\0”结束。
char*p=”CLanguage”;的作用是:
使指针变量P指向字符串的起始地址。
六、指针数组
一个数组,如果每个元素的类型都是整型的,那么这个数组称为整型数组;如果每个元素都是同类型的指针类型,则它是指针数组。
也就是说,指针数组是用来存放一批地址的。
前已述及,在初始化字符数组时,可以用指针变量来代替字符数组。
例如:
char*string=“Iamastudent”;
如果有五个字符串,可以用五个指针变量来指向它,这就是指针数组。
例如:
char*name[5]={“LiFang”,“ZhangLi”,“LingMaoTi”,“SunFei”,“Wangfang”}
name是一维数组,它有五个元素,每个元素都是指向字符数据的指针型数据。
其中,name[0]指向第一个字符串“LiFang”。
七、指针与函数
指针与函数的关系,主要表现在如下三个方面:
1.用指针作为函数参数
2.函数的返回值是指针
3.指向函数的指针
1.指针作为函数参数
例:
有一数组,有10个元素,要求输出其中最大和最小的元素。
#defineN10
voidmain()
{
voidmax_min(intarr[],int*pt1,int*pt2,intn);
intarray[N]={1,8,10,2,-5,0,7,15,4,-5};
int*p1,*p2,a,b;
p1=&a;p2=&b;
max_min(array,p1,p2,N);
printf(“max=%d,min=%d\n”,a,b);
}
voidmax_min(intarr[],int*pt1,int*pt2,intn)
{
inti;
*pt1=*pt2=arr[0];
for(i=0;i{
if(arr[i]>*pt1)*pt1=arr[i];
if(arr[i]<*pt2)*pt2=arr[i];
}
}
2.指向函数的指针
一个函数包括一系列的指令,在内存中占据一片存储单元,它有一个起始地址,即函数的入口地址,通过这个地址,可以找到该函数,这个地址就称为函数的指针。
我们可以定义一个指针变量,使它的值等于函数的入口地址,那么通过这个指针变量,也能调用该函数,这个指针变量称为指向函数的指针变量。
定义一个指向函数的指针变量的一般形式:
类型标识符(*指针变量名)();
例如int(*p)();
它表示p指向一个返回值为整型的函数。
注意,*p两边的括弧不能省略。
如果写成int*p();就称了返回指针值的函数。
在定义了指向函数的指针变量后,可以将一个函数的入口地址赋给它,这就实现了使指针变量指向一个指定的函数。
如:
p=fun1;
可以用下列形式调用函数:
(*指针变量)(实参列表);
例如:
(*p)(a,b);其相当于fun1(a,b);也可以写成p(a,b);
例6.26写一个程序,给出一个一维数组的元素值,先后四次调用一个函数,分别求①数组中元素之和②最大值③下标为奇数的元素之和④求各元素的平均值。
#defineN12
main()
{
staticfloata[12]={1.5,3.8,5.6,7.8,91.6,1.61,13.3,
15.0,17.5,19.9,21.7,23.0};
floatarr_add(),odd_add(),arr_ave(),arr_max();
voidprocess(float*p,intn,float(*fun)());
intn=N;
printf("thesumof%delementsis:
",n);
process(a,n,arr_add);
printf("thesumofoddelementsis:
");
process(a,n,odd_add);
printf("theaverageof%delementsis:
",n);
process(a,n,arr_ave);
printf("themaximumof%delementsis:
",n);
process(a,n,arr_max);
}
voidprocess(float*p,intn,float(*fun)())
{
floatresult;
result=(*fun)(p,n);
printf("%8.2f\n",result);
}
floatarr_add(floatarr[],intn)
{
inti;
floatsum=0;
for(i=0;isum=sum+arr[i];
return(sum);
}
floatodd_add(float*p,intn)
{
inti;
floatsum=0;
for(i=0;isum=sum+*p;
return(sum);
}
floatarr_ave(float*p,intn)
{
inti;
floatsum=0,ave;
for(i=0;isum=sum+p[i];
ave=sum/n;
return(ave);
}
floatarr_max(floatarr[],intn)
{
inti;
floatmax;
max=arr[0];
for(i=1;iif(arr[i]>max)max=arr[i];
return(max);
}
4.返回指针的函数
一个函数在调用之后可以带回一个值返回到主调函数,这个值可以是整型、实型、字符型等,也可以是一个指针类型。
定义这种函数的例子如:
int*fun(a,b);
例:
编写一个函数,它的作用是在一个字符串中找一个指定的字符,并返回该字符的地址
char*strchr(char*str,charch)
{
while(*str++!
='\0')
if(*str==ch)
returnstr;
return(0);
}
main()
{
char*strchr(char*str,charch);
char*pt,ch,line[]="IloveChina";
ch='C';
pt=strchr(line,ch);
printf("\nstringstartsataddress%o.\n",line);
printf("Firstoccurrenceofchar%cisaddress
%o.\n",ch,pt);
printf("Thisisposition%d(startingfrom0)\n",pt-line);
}
八、指针的运算
指针是一种数据类型,应具有无符号整数的值。
由于地址本身的特征,也给指针运算带来一些限制,它只能进行:
●与整数相加、减运算
●同一数组中各元素地址间的关系运算与相减运算
●赋值运算
其它的运算,如两个指针相加、相乘、相除、移位以及指针与实数相加等都是不允许的。
(一)指针与整数相加、减
指针与整数相加、减,表示指针在内存空间上、下移动,移动以其类型的长度为单位。
(二)指向同一数组中元素的指针的关系运算与相减运算
指向同一数组中元素的指针的关系运算,是比较它们之间的地址大小。
两个指针相等,表明它们指向同一数组元素。
两个指向同一数组中的元素的指针相减,是计算它们之间的元素数目。
(三)指针赋值
指针可以通过赋值运算改变其所指向的实体,有三种情形:
(1)给指针赋以一个对应类型的变量地址,如
floatf1,f2;
float*p=&f1;
(2)同一类型指针间的赋值,如
inta,b;
int*pa=&a,*pb=&b;
pa=pb;
(3)指针增1、减1,即指针向上或向下移动一个所指向的数据类型空间。