一维指针数组声明:
T *p[n];//T是类型,p是标识符(被声明的数组变量),n是数组大小
//*的优先级低于[]所以该声明相当于声明:
T*(p[n]);
//p[n]表示p是n个元素的数组,数组元素是T*类型,即指向T类型变量的指针类型
eg1-指向指针的指针、指针数组与数组的关系:
#include
int 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-二维数组、指针数组和指针间的关系:
#include
int 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 %d\n",*(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 = %f\n";
printf(str,x,y); //正确,相当于printf("x = %d y = %f\n",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++) != '\0' && *(str2++) != '\0');
return 0; //两个串全部接束,长度一定相同,否则不能退出循环
}
void sort_string(char * arr_str[],int n){
char *temp;
int i,j,k;
for(i = 0;i<n-1;i++){
k = i;
for(j = i+1;j<n;j++)
if(str_cmp(arr_str[k],arr_str[j]) > 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<n;j++)
printf("%s",arr_str[j]);
}
int main(){
char *name[] = {"basic","programming","great wall","language","computer"};
sort_string(name,5);
out_string(name,5);
}