C语言:指针总结(二:指针与数组、字符串)

指针与数组、字符串

指针与数组—指针数组

一维指针数组声明:

T *p[n];//T是类型,p是标识符(被声明的数组变量),n是数组大小
//*的优先级低于[]所以该声明相当于声明:
T*(p[n]);
//p[n]表示p是n个元素的数组,数组元素是T*类型,即指向T类型变量的指针类型

p本身是一个指针常量,指向n个元素的数组,数组的每个元素是指针。
指针数组是右指针构成的数组
C语言:指针总结(二:指针与数组、字符串)_第1张图片

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三者的关系:
C语言:指针总结(二:指针与数组、字符串)_第2张图片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]);
	 
}

程序运行结果:
C语言:指针总结(二:指针与数组、字符串)_第3张图片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]);

C语言:指针总结(二:指针与数组、字符串)_第4张图片

指针与字符串

字符串与字符指针变量的对比(这个表格很清晰):

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);
}
 

你可能感兴趣的:(C语言,c语言)