指针类型是C语言提供的一种特殊的基本数据类型。指针类型的变量中存放的不是待操作的数据,而是那些待操作数据的存储地址。
- ‘&’ 被称为取地址运算符,只有输入字符串时,不需要使用运算符 &,因为数组名就是数组存储空间的首地址。定义一个指针型变量的语法格式是:<数据类型> * <指针型变量名>;
- ‘*’ 与‘&’ 相反,它将返回指针型变量所指变量的内容,因此,又被称为取内容运算,如 *intptr = 30,*chptr = 'p';。
- 基于指针的数据访问就是根据指针型变量中保存的存储地址来访问存储空间中的数据,只有把存储地址保存到指针变量之后,才有可能通过指针型变量来访问存储器中的数据。
- 指针的比较就是地址的比较,指针的加减法就是地址和整数之间的运算,而乘法和除法对于地址运算是没有意义的。
- 注意几个等价关系:例如,定义如下数组变量:int data[10];int *ptr;ptr=&data[0];,C语言规定数组名就是其首元素地址。
- 存在如下等价关系:
- data+idx,&data[idx],ptr+idx,&ptr[idx](地址关系); data[idx],*(data+idx),ptr[idx],*(ptr+idx)(数据关系)。
#include<stdio.h>
int main(){
int *p,s[9]={1,2,3,4,5,6,7,8,9};
for(int i=0;i<9;i++){
printf("%5d",s[i]);
}
printf("\n");
p=s;//等效于p=&s[0]
printf("%d\n",*p);
*p=100;//等效于s[0]=100
*(p+1)=200;//等效于s[1]=200
for(int i=0;i<9;i++){
printf("%5d",s[i]);
}
return 0;
}
运行结果如下:
指针型实现选择排序:
int *search(int key,int *plow,int *phigh){
int *pmid;
if(plow>phigh)
return NULL;
pmid=plow+(phigh-plow)/2;
if(*pmid==key)
return pmid;
if(key<*pmid)
return search(key,plow,pmid-1);
else
return search(key,plow+1,phigh);
}