一维指针数组声明:
T *p[n];//T是类型,p是标识符(被声明的数组变量),n是数组大小 //*的优先级低于[]所以该声明相当于声明: T*(p[n]); //p[n]表示p是n个元素的数组,数组元素是T*类型,即指向T类型变量的指针类型
p本身是一个指针常量,指向n个元素的数组,数组的每个元素是指针。
指针数组是右指针构成的数组
eg1-指向指针的指针、指针数组与数组的关系:
#includeint main(){ int a[5] = {23,24,25,26,27}; int *n[5],i;//n是一个指针数组,每一个变量都是指针 int **p = n;//p为指向指针的指针变量 for(i = 0;i<5;i++) n[i] = &(a[i]); for(i = 0;i<5;i++,p++) printf("%d ",**p); }
程序运行结果:
p,n,a三者的关系:
eg2-二维数组、指针数组和指针间的关系:
#includeint a[][4] = {{1,2,3,4},{11,12,13,14},{21,22,23,24}, {31,32,33,34},{41,42,43,44}}; int *pa[] = {a[0],a[1],a[2],a[3],a[4]}; int *p = a[0];//或 aptr = &(a[0][0]) 或 aptr = *a; int main(){ for(int i = 0;i<3;i++) printf("%d %d %d n",a[i][2+i],*(a[i]),*(p+i*4+i)); for(int i = 0;i<4;i++) printf("%d %dn",*(pa[i]),p[i]); }
程序运行结果:
a,pa,p之间的关系
eg3:设有如下程序片段
char c1[] = "copy"; char c2[] = "jilin.dat",c2[] = "changchun.dat",c4[] = "beijing"; char *aptr[4],**ptr1,**ptr2; ptr1 = aptr; *prt1 = c1; *(ptr1 + 1) = c2; aptr[2] = c3; ptr1[3] = c4; ptr2 = &(aptr[0]);指针与字符串
字符串与字符指针变量的对比(这个表格很清晰):
a.char str[20] = "I am a teacher";//正确,初始化数组str
b.char str0[20],str[20] = "I am a teacher";
str0 = str; //错误,给指针常量赋值,数组不能整体赋值
c.char str[20];
str = "I am a teacher"; //错误, 给指针常量赋值,数组不能整体赋值
d.char str[20];
str[] = "I am a teacher ";//错误,给指针常量赋值
//str[]出现在=左端,意义不明确
e.char *str;
str = "I am a teacher"; //正确,给指针变量赋值,str指向常量字符串
f.char str[20];
scanf("%s",str); //正确,输入字符串
g.char *str;
scanf("%s",str); //错误,str不指向任何变量,输入的字符串无处存放
h.char *str,str0[20];
str = str0;
scanf("%s",str); //正确,输入字符串数据从str0[0]开始存放//必须对字符指针进行初始化!
i. char *str,str0[20];
str = str0+5;
scanf("%s",str); //正确,输入字符串数据从str0[5]开始存放
//输出
j. char str[20] = "I am a teacher";
printf("%s",str); //正确 打印 I am a teacher
k. char * str = "I am a teacher";
printf("%s",str); //正确 打印 I am a teacher
l.char *str = " I am a teacher" ;
str = str+5;
printf("%s",str); //正确 打印a teacher
m.int x,y;
char *str = "x = %d y = %fn";
printf(str,x,y); //正确,相当于printf("x = %d y = %fn",x,y);
字符串数组
char * a[]
一个数组 每一个元素都是指针 指向一个字符串
char *a[] = {
"Hello";//a[0]
"World";//a[1]
};
eg:一个运用例 把若干给定的字符串按照字母顺序排序并输出
int str_cmp(char*str1,char*str2){
do{
if(*str1>*str2)//比较当前字符
return 1; //str1长或str1当前字母大于str2
else if(*str1 < *str2)
return -1;
}while(*(str1++) != ' ' && *(str2++) != ' ');
return 0; //两个串全部接束,长度一定相同,否则不能退出循环
}
void sort_string(char * arr_str[],int n){
char *temp;
int i,j,k;
for(i = 0;i 0)
k = j;
temp = arr_str[i];
arr_str[i] = arr_str[k];
arr_str[k] = temp;
}//for
}//sor_string
void sort_string(char *arr_str[],int n){
int j;
for(j = 0;j



