C语言程序设计第四版 谭浩强 第八章 课后答案(含注解)

第8章 善于利用指针

注:
本章习题要求用指针的方法处理

1.输入3个整数,按由小到大的顺序输出

#include<stdio.h>

void swap(int *a,int *b){ 
	int temp = *a;
	*a = *b;
	*b = temp;

}

int main(){ 
	int a,b,c;
	scanf("%d%d%d",&a,&b,&c);
	if(a>b) swap(&a,&b);
	if(a>c) swap(&a,&c); //第一个数a为最小的数 
	if(b>c) swap(&b,&c); //再找出第二小的数 
	printf("%d%d%d",a,b,c);
} 

2.输入3个字符串,按由小到大的顺序输出

#include<stdio.h>
#include<string.h>

void swap(char* p1,char* p2){ 
	char p[20];
	strcpy(p,p1);
	strcpy(p1,p2);
	strcpy(p2,p);
}

int main(){ 
	char str1[20],str2[20],str3[20];
	printf("input three line:\n");
	gets(str1);
	gets(str2);
	gets(str3);
	if(strcmp(str1,str2)>0) swap(str1,str2);
	if(strcmp(str1,str3)>0) swap(str1,str3);
	if(strcmp(str2,str3)>0) swap(str2,str3);
	printf("now,this order is:\n");
	printf("%s\n%s\n%s\n",str1,str2,str3); 
	
}

3.输入10个整数,将其中最小的数与第1个数对换,把最大的数与最后一个数对换。写3个函数①输入10个数;②进行处理;③输出10个数

#include<stdio.h>

void max_min_value(int* a){ 
	int *min,*max,*p,temp;
	max = min = a;
	for(p = a;p < a+10;p++)
		if(*p > *max) max = p;//找最大
	temp = a[9];a[9] = *max;*max = temp;
	for(p = a;p < a+10;p++)
		if(*p < *min) min = p;//找最小
	temp = a[0];a[0] = *min;*min = temp;	
	
}

int main(){ 
	int a[10] = { 32,24,56,78,1,98,36,44,29,6};
	max_min_value(a);
	for(int i = 0 ;i < 10;i++){ 
		printf("%-3d",a[i]);
	}
	
}

4.有n个整数,使前面的各数向后移m个位置,最后m个数变成最前面m个数。

1 2 3 4 5 移动2位
4 5 1 2 3

#include<stdio.h>

//法1:借用指针+递归 
void move1(int a[],int n,int m){ 
	int *p,a_end;
	a_end = *(a+n-1); //保存最后一个元素的值
	for(p = a+n-1;p > a;p--)
		*p = *(p-1); //整个数组向后移动一位
	*p = a_end; //给第一个元素赋值为变化前最后一个元素
	m--; //一趟向后移动一位 m-1
	if(m > 0) move1(a,n,m); //递归调用
}
//法二:利用新数组
void move2(int a[],int n,int m){ 
	int b[5],*p;
	for(int i = 0;i < 5;i++){ 
		b[ (i+m)%n ] = a[i]; //求模赋值
	}

	for(int i = 0;i < 5;i++){ 
		*(a+i) = *(b+i);
	// printf("%-3d",a[i]);
	} 
	
} 


int main(){ 
	int a[5] = { 1,2,3,4,5};
// move1(a,5,2);
// for(int i = 0;i < 5;i++)
// printf("%-3d",a[i]);
	
	move2(a,5,2);
	for(int i = 0;i < 5;i++)
		printf("%-3d",a[i]);
}

5.n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号。

#include<stdio.h>

int main(){ 
	int num[50],k,i,n,m,*p;
	printf("请输总共有多少人:\n");
	scanf("%d",&n);
	p = num;
	for(i = 0;i < n;i++)
	 *(p+i) = i+1; //1到n编号
	i = 0; //i为每次循环时计数变量
	k = 0; //k为按1,2,3报数时的计数变量 
	m = 0; //m为退出人数 
	while(m < n-1){  //当退出人数比n-1少时(既未退出人数大于1时)执行循环体
		if( *(p+i) != 0 )  k++;
		if(k == 3){ 
			*(p+i) = 0; //退出的人编号置为0
			printf("%d号淘汰\n",i+1);
			k = 0;
			m++;  //淘汰人数加1 
		}
		i++;
		if(i == n) i=0; //报数到尾后,i回复为0 
	} 
	while(*p == 0) p++;
	printf("最后剩下的元素为: %d\n",*p);
	return 0; 
	 
} 

6.写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。

#include<stdio.h>

int strlen(char *s){ //求字符串长度
	printf("strlen\n");
	int len = 0;
	char *p = s;
	while(*p != '\0'){  //报错 p != '\0' 
		p++;
		len++;
	}
	return len;
}

int main(){ 
	char s[20];
	gets(s); //输入字符串 
	//puts(s); 
	int len = strlen(s);
	printf("s的长度为:%d\n",len);
}

7.有一个字符串包含n个字符。写一个函数,将此字符串从第m个字符开始的全部字符串复制为另一个字符串。

#include<stdio.h>
#include<string.h>

void copystr(char* p1,char* p2,int m);

int main(){ 
	char str1[20],str2[20];
	int m;
	printf("请输入要复制字符串:\n");
	gets(str1);
	printf("请输入从第几位开始复制\n");
	scanf("%d",&m);
	if(strlen(str1) < m)
		printf("输入有误\n");
	else{ 
		copystr(str1,str2,m); 
		printf("复制后的字符串为:\n"); 
		printf("%s",str2
		);	
	}
} 

void copystr(char* p1,char* p2,int m){ 
	printf("copystr~~~\n"); 
	int n=0;
	while(n < m-1){ 
		n++;
		p1++;
	}
	while(*p1 != '\0'){ 
		*p2 = *p1;
		p1++;
		p2++;
	}
	*p2 = '\0';
}

8.输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少。

#include<stdio.h>

int main(){ 
	int upper=0,lower=0,digit=0,space=0,other=0,i=0;
	char *p,s[20];
	printf("input string: ");
	while( ( s[i]=getchar() )!='\n') i++;
	p = s;
	while(*p != '\n'){ 
		if( (*p >= 'A')&&(*p <= 'Z') )
			++upper;
		else if((*p >= 'a')&&(*p <= 'z'))
			++lower;
		else if(*p == ' ')
			++space;
		else if((*p >='0' )&&(*p <='9'))
			++digit;
		else
			other++;
		p++;
	} 
	
	printf("upper case:%d lower case:%d",upper,lower);
	printf(" space case:%d digit case :%d other case:%d\n",space,digit,other);
	
}

9.写一个函数将一个3*3的矩阵转置

#include<stdio.h>

//a[i][j]的地址是p+3*i+j
//a[j][i]的地址是p+3*j+i 
//a[i][j] a[j][i]地址相同 

void move(int *p){ 
	int i,j,t;
	for(i = 0;i < 3;i++){ 
		for(j = i;j < 3;j++){  //j=i 不是 j=0 
			t = *(p+3*i+j);
			*(p+3*i+j) = *(p+3*j+i);
			*(p+3*j+i) = t;
		}
	}
}

void move2(int a[][3]){ 
	int i,j,t;
	for(i = 0;i < 3;i++){ 
		for(j = i;j < 3;j++){  //j=i 不是 j=0 
			t = a[i][j];
			a[i][j] = a[j][i];
			a[j][i] = t;
		}
	}
}

int main(){ 
	int i,j,*p;
	int a[3][3]={ 1,2,3,4,5,6,7,8,9};
	p = &a[0][0];
	for(i = 0;i < 3;i++){ 
		printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
	} 

	//move(p);
	move2(a);
	printf("变化后\n"); 
	for(i = 0;i < 3;i++){ 
		printf("%d %d %d\n",a[i][0],a[i][1],a[i][2]);
	} 
}

10.将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下),写一个函数实现。套娃题,脑壳疼

#include<stdio.h>

void change(int *p){ 
	int i,j,temp;
	int *max,*min;
	max = min = p;
	for(i = 0;i < 5;i++){ 
		for(j = 0;j < 5;j++){ 
			if(*max < *(p+5*i+j)) max = p+5*i+j;
			if(*min > *(p+5*i+j)) min = p+5*i+j;
		}
	}
	temp = *(p+12); //将最大值与中间元素互换
	*(p+12) = *max;
	*max = temp;
	
	temp = *p; //将最小值与左上角元素互换
	*p = *min;
	*min = temp;
	
	min = p+1; //将a[0][1]的最地址给min,从该位置开始找最小的值
	for(i = 0;i < 5;i++){ 
		for(j = 0;j < 5;j++){ 
			if(i == 0 && j == 0) continue; 
			if(*min > *(p+5*i+j)) min = p+5*i+j;
		}
	}
	
	temp = *min;  //将第二小的值跟右上角的互换 
	*min = *(p+4);
	*(p+4) = temp;
	 
	min = p + 1; //找到第三小的值 
	for(i = 0;i < 5;i++){ 
		for(j = 0;j < 5;j++){ 
			if((i==0 && j==0)||(i==0 && j==4)) continue; 
			if(*min > *(p+5*i+j)) min = p+5*i+j;
		}
	}
	
	temp = *min;  //将第三小的值跟左下角的互换 
	*min = *(p+20);
	*(p+20) = temp;
	
	min = p + 1; //找到第四小的值 
	for(i = 0;i < 5;i++){ 
		for(j = 0;j < 5;j++){ 
			if((i==0&&j==0)||(i==0&&j==4)||(i==4&&j==0)) continue; 
			if(*min > *(p+5*i+j)) min = p+5*i+j;
		}
	}
	temp = *min;  //将第四小的值跟右下角的互换 
	*min = *(p+24);
	*(p+24) = temp;
}

int main(){ 
	int a[5][5]={ 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};
	int i,j,*p;
	p = &a[0][0];
	change(p);
	//打印变化后的数组 
	for(i = 0;i < 5;i++){ 
		for(j = 0;j < 5;j++)
			printf("%-4d",a[i][j]);
		printf("\n"); 
	}
} 

11.在主函数中输入10个等长的字符串。用另一函数对他们排序。然后在主函数输出这10个已经排好序的字符串

#include<stdio.h>
#include<string.h>

void sort(char s[3][6]){  //形参s是指向6个元素一组的指针 
	int i,j;
	char *p,temp[10]; //temp为临时容器长度要大于6 
	p = temp;
	//字符串版的冒泡排序 由于下面if是s[j]与s[j+1]比较所有i不能到3否则数组会溢出 
	for(i = 0;i < 2;i++){ 
		for(j = 0;j < 2-i;j++){ 
			if(strcmp(s[j],s[j+1])>0){ 
	//以下三行是将s[j]指向的一维数组与s[j+1]指向的一维数组的内容互换 
				strcpy(p,s[j]);
				strcpy(s[j],s[j+1]);
				strcpy(s[j+1],p);
			}
		}
	} 
} 

int main(){ 
	int i;
	char str[3][6]; //主要是算法数组大小无所谓
	printf("输入3个长度为6的字符串\n");
	for(i = 0;i < 3;i++)
		scanf("%s",str[i]);
	sort(str);
	printf("排序后为:\n");
	for(i = 0;i < 3;i++)
		printf("%s\n",str[i]);
	return 0;
}

12.用指针数组处理上一题目,字符串不等长。

#include<stdio.h>
#include<string.h>

void sort(char *s[]){   
	int i,j;
	char *temp; //temp为临时容器长度要大于6 
	//字符串版的冒泡排序 
	for(i = 0;i < 4;i++){ 
		for(j = 0;j < 4-i;j++){ 
			if(strcmp(*(s+j),*(s+j+1))>0){ 
				temp = *(s+j);
				*(s+j) = *(s+j+1);
				*(s+j+1) = temp;
			}
		}
	} 
} 

int main(){ 
	int i;
	char *p[5],str[5][20]; //主要是算法,数组大小无所谓
	for(i = 0;i < 5;i++)
		p[i]=str[i];        //将第i个字符的首地址赋予指针数组p的第i个元素 
	printf("输入5个字符串\n");
	for(i = 0;i < 5;i++)
		scanf("%s",p[i]);
	//sort(p);
	printf("排序后为:\n");
	for(i = 0;i < 5;i++)
		printf("%s\n",p[i]);
	return 0;
}

13.写一个函数用矩形求定积分的通用函数,分别别F(0,1) sinx dx,F(-1,1) cosx dx,F(0,2) exp(x) dx的定积分.

说明:sin,cos,exp已在系统的数学函数库中.
#include<stdio.h>
#include<math.h>
int main()
{ float integral(float(*)(float),float,float,int);//对integarl函数的声明
float fsin(float);          //对fsin函数的声明
float fcos(float);          //对fcos函数的声明
float fexp(float);          //对fexp函数的声明
float a1,b1,a2,b2,a3,b3,c,(*p)(float);
int n=20;
printf("input a1,b1:");
scanf("%f,%f",&a1,&b1);
printf("input a2,b2:");
scanf("%f,%f",&a2,&b2);
printf("input a3,b3:");
scanf("%f,%f",&a3,&b3);
p=fsin;
c=integral(p,a1,b1,n);
printf("The integral of sin(x) is:%f\n",c);
p=fcos;
c=integral(p,a2,b2,n);
printf("The integral of cos(x) is:%f\n",c);
p=fexp;
c=integral(p,a3,b3,n);
printf("The integral of exp(x) is:%f\n",c);
return 0;
}

float integral(float(*p)(float),float a,float b,int n)
{ int i;
 float x,h,s;
 h=(b-a)/n;
 x=a;
 s=0;
 for(i=1;i<=n;i++)
  { x=x+h;
   s=s+(*p)(x)*h;
  }
  return(s);
}
  float fsin(float x)
    { return sin(x);}
  float fcos(float x)
    { return cos(x);}
  float fexp(float x)
    { return exp(x);}

14.将n个数按输入时的顺序逆序排列,用函数实现.

#include<stdio.h>

void sort(char* p,int m){ 
	int i;
	char temp,*p1,*p2; //双指针,一头一尾同时工作,替换值
	for(i=0;i<m/2;i++){  //i只到m的中间 
		p1 = p+i;//从头到中间 
		p2 = p+(m-1-i);//从尾到中间 
		temp = *p1; //首尾交换 
		*p1 = *p2;
		*p2 = temp; 
	
	} 
} 

int main(){ 
	int i,n;
	char *p,num[20];
	printf("input n:");
	scanf("%d",&n);
	printf("input this numbers:\n");
	for(i=0;i<n;i++){   //i要从0开始 
		scanf("%d",&num[i]);
	}
	p = &num[0];
	sort(p,n);
	for(i=0;i<n;i++){ 
		printf("%d ",num[i]);
	}
} 

15.有一个班4个学生,5门课程.①求第一门课程的平均分;②找出有两门以上课程不及格的学生,输出他们的学号和全部课程及平均成绩;③找出平均成绩在90分以上或者全部课程在85分以上的学生.分别编三个函数实现3个要求

#include <stdio.h>
/* 输入课程 English computer math physics chemistry 输入成绩 101 34 56 88 99 89 102 27 88 99 67 78 103 99 90 87 86 89 104 78 89 99 56 77 */ 
void avsco(float *,float *);   // 求每个学生的平均成绩的函数
void avcour1(char (*)[10],float *); // 求第一课程的平均成绩的函数
void fali2(char course[5][10],int num[],float *pscore,float aver[4]); // 找两门以上课程不及格的学生的函数
void good(char course[5][10],int num[4],float *pscore,float aver[4]); //满足③ 

int main()
{ 
 	int i,j,*pnum,num[4];
 	float score[4][5],aver[4],*pscore,*paver;
 	char course[5][10],(*pcourse)[10];
 	printf("input course:\n");
 	pcourse=course;   
 	for (i=0;i<5;i++)
 		scanf("%s",course[i]);
	 printf("input NO. and scores:\n");
	 printf("NO.");
	 for (i=0;i<5;i++)
	   printf(",%s",course[i]);
	 printf("\n");
	 pscore=&score[0][0];
	 pnum=&num[0];
	 for (i=0;i<4;i++)
	 { 
	 	scanf("%d",pnum+i); //pnum记录学号 num[i][0] 
	  	for (j=0;j<5;j++)
	   		scanf("%f",pscore+5*i+j); //pscore 记录分数 
	 }
	 paver=&aver[0];
	 printf("\n\n");             
	 avsco(pscore,paver);                  // 求出每个学生的平均成绩
	 avcour1(pcourse,pscore);                // 求出第一门课的平均成绩 (pcourse指向课程数组) 
	 printf("\n\n");
	 fali2(pcourse,pnum,pscore,paver);       // 找出2门课不及格的学生
	 printf("\n\n");
	 good(pcourse,pnum,pscore,paver);        // 找出成绩好的学生
	 return 0;
}

void avsco(float *pscore,float *paver)  // 求每个学生的平均成绩的函数
{ 
	
 	int i,j;
 	float sum,average;
  	for (i=0;i<4;i++)
    { 
	   	sum=0.0;
	    for (j=0;j<5;j++)
	     	 sum=sum+(*(pscore+5*i+j));       //累计每个学生的各科成绩
	    average=sum/5;                   //计算平均成绩
	    *(paver+i)=average;  //paver是存每个学生平均成绩的数组 
    }
}

//char (*pcourse)[10]:是一个数组指针,这个指针是指向一个度大小为10的字符数组; 
void avcour1(char (*pcourse)[10],float *pscore)      // 求第一课程的平均成绩的函数
 { int i;
  float sum,average1;
  sum=0.0;
  for (i=0;i<4;i++)
    sum=sum+(*(pscore+5*i));               //累计每个学生的得分 sum最终为第一列值的和 
  average1=sum/4;                        //计算平均成绩
  printf("course 1:%s average score:%7.2f\n",*pcourse,average1);
}

void fali2(char course[5][10],int num[],float *pscore,float aver[4]) 
           // 找两门以上课程不及格的学生的函数
 { 
	 int i,j,k,labe1;
	  printf(" ==========Student who is fail in two courses======= \n");
	  printf("NO. ");
	  for (i=0;i<5;i++)
	    printf("%11s",course[i]);
	  printf(" average\n");
	  for (i=0;i<4;i++)
 	  { 
 	 	
	  	labe1=0;      //记录不及格的科目数 
   		for (j=0;j<5;j++)
    		 if (*(pscore+5*i+j)<60.0) labe1++;
  		if (labe1>=2)
    	{ 
			printf("%d",num[i]);
   			for (k=0;k<5;k++)
      			printf("%11.2f",*(pscore+5*i+k)); //输出有两门不及格学号的所有成绩 
    		 printf("%11.2f\n",aver[i]);  //直接输出之前记录下的平均值 
   		 }
      }
}

void good(char course[5][10],int num[4],float *pscore,float aver[4])
   // 找成绩优秀学生(各门85以上或平均90分以上)的函数
 { 
  int i,j,k,n;
  printf(" ======Students whose score is good======\n");
  printf("NO. ");
  for (i=0;i<5;i++)
    printf("%11s",course[i]);
  printf(" average\n");
  for (i=0;i<4;i++)
   { n=0;
    for (j=0;j<5;j++)
      if (*(pscore+5*i+j)>85.0) n++;
    if ((n==5)||(aver[i]>=90))
     { printf("%d",num[i]);
      for (k=0;k<5;k++)
        printf("%11.2f",*(pscore+5*i+k));
      printf("%11.2f\n",aver[i]);
     }
 }
}

16. 输入一个字符串,内有数字和非数字字符,例如:

a123x456 17960? 302tab5876

将其中连续的数字作为一个整数,依次存放到一数组a中。例如,123存入在a[0],456存放在a[1]……统计共有多少整数,并输出这些数。

#include <stdio.h>
int main()
{
 char str[50],*pstr;
 int i,j,k,m,e10,digit,ndigit,a[10],*pa;
 printf("input a string:\n");
 gets(str);
 pstr=&str[0];    /*字符指针pstr置于数组str 首地址*/
 pa=&a[0];        /*指针pa置于a数组首地址*/
 ndigit=0;        /*ndigit代表有多少个整数*/
 i=0;             /*代表字符串中的第几个字符*/
 j=0;            /*记录数字连续的个数*/ 
 while(*(pstr+i)!='\0')
 {
  if((*(pstr+i)>='0') && (*(pstr+i)<='9'))
       j++;
     else
       {
  if (j>0)
        {digit=*(pstr+i-1)-48;          /*将个数位赋予digit,字符 0对应的ascii码为 48*/
         k=1;
         while (k<j)     /*将含有两位以上数的其它位的数值累计于digit*/
           {e10=1;
         for (m=1;m<=k;m++)
         e10=e10*10;                  /*e10代表 该位数所应乘的因子*/
         digit=digit+(*(pstr+i-1-k)-48)*e10;  /*将该位数的数值\累加于digit*/
         k++;                   /*位数K自增*/
           }
         *pa=digit;               /*将数值赋予数组a*/
         ndigit++;
         pa++;                    /*指针pa指向a数组下一元素*/
         j=0;
        }
    }
     i++;
    }
 if (j>0)                         /*以数字结尾字符串 j还是>0不能处理,或者是全是数字的情况下 j也是 >0*/
  {digit=*(pstr+i-1)-48;          /*将个数位赋予digit*/
   k=1;
   while (k<j)          /* 将含有两位以上数的其它位的数值累加于digit*/
    {e10=1;
     for (m=1;m<=k;m++)
       e10=e10*10;            /*e10代表位数所应乘的因子*/
     digit=digit+(*(pstr+i-1-k)-48)*e10;  /*将该位数的数值累加于digit*/
     k++;  /*位数K自增*/
    }
   *pa=digit;                 /*将数值赋予数组a*/
   ndigit++;
   j=0;
  }
  
  
  printf("There are %d numbers in this line, they are:\n",ndigit);
  j=0;
  pa=&a[0];
  for (j=0;j<ndigit;j++)            /*打印数据*/
    printf("%d ",*(pa+j));
  printf("\n");
  return 0;
}

17.编写一个函数,实现两个字符串的比较.即自己写一个strcmp函数,函数原型为strcmp(char *p1,char *p2);

#include<stdio.h>

int mystrcmp(char *p1,char *p2){
	int i = 0;
	while( *(p1+i) == *(p2+i) )
		if( *(p1+i++) == '\0' ) return 0;  //相等时返回结果0 
	return (*(p1+i) - *(p2+i));  //不等时返回第一个结果不相等字符的差值 
	
} 
int main(){
	int m;
	char str1[20],str2[20],*p1,*p2;
	printf("请输入两串字符串\n");
	gets(str1);
	gets(str2);
	p1 = str1;
	p2 = str2;
	m = mystrcmp(p1,p2);
	printf("%d",m);
}

18编写一个程序,输入月份号,输出改月份的英文月名.例如输入”3″,则输出”march”,要求用指针数组处理.

#include <stdio.h>

/* void someFunc(char *someStr); 再看这个函数调用: someFunc("I'm a string!"); 把这两个东西组合起来,用最新的g++编译一下就会得到标题中的警告。 为什么呢?原来char *背后的含义是:给我个字符串,我要修改它。 而理论上,我们传给函数的字面常量是没法被修改的。 所以说,比较和理的办法是把参数类型修改为const char *。 这个类型说背后的含义是:给我个字符串,我只要读取它。 */

int main()
{
    const char * month[13]={
  "illegal","January", "Februray", "March", "April", "May", "June", "July",
						"August", "September", "October", "November", "December"};
    int n;
    printf("Please enter month: \n");
    scanf("%d", &n);
    if ( (n <= 12) && (n >= 1) )
    	printf("It is %s.\n",*(month+n));
    else{
		printf("Error!\nPlease enter month: ");
		scanf("%d", &n);
		//output(m, month);
	}
    
    return 0;
}

19(1)编写一个函数new,对n个字符开辟连续的存储空间,此函数应返回一个指针地址,指向字符串开始的空间.new(n)表示分配了n个字节的内存空间

19(2)编写函数free,free的作用是是newp的值恢复为p.

new为关键字自己写函数不要用这个new命名

#include<stdio.h>

#define NEWSIZE 1000 //指定开辟存储区的最大容量
int newbuf[NEWSIZE]; //定义字符串数组newbuf
int *newp = newbuf; //定义指针变量newp,指向存储区的始 端


int* my_new(int n){ //定义开辟存储区的函数new,开辟数组后返回指针 
	if(newp+n <= newbuf+1000){ //开辟区未超过newbuf数组的大小 
		newp += n;  //newp指向存储区末尾 
		return newp-n; //返回首地址 
	}
	else
	return NULL; //存储区不够分配时,返回一个空指针 
} 

void my_free(int *p){  //释放存区函数 
	if(p >= newbuf && p<newbuf+1000)
		newp = p;
}

int main(){

	int *p = my_new(5);

	for(int i=0;i<5;i++){
		p[i]=i;
	} 
	my_free(p); //让newp回到初始位置 

	for(int i=0;i<5;i++){
		printf("%d\n",newp[i]);  //此时newp的位置等于 p[0] 
	} 
} 

20.用指向指针的指针的对5个字符串进行排序并输出

/* 测试数据 China America India Philippines Canada 排序后输出为: America Canada China India Philippines AZZ B C D E */

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void sort(char **p) //冒泡排序交换字符串 
{ 
	char **q, **s, *t;
	for (q = p; q < p + 4; q++) 
	{ 
		for (s = p+4; s > q; s--)
		{ 
			if (strcmp(*q, *s) > 0)
			{ 
				printf("*q_初始地址=%d\n",*q);
				printf("*s_初始地址=%d\n",*s);
				printf("\n");
				
				printf("*q_字符串=%s\n",*q);
				printf("*s_字符串=%s\n",*s);
				printf("\n");
				t = *q;
				*q = *s;
				*s = t;
				printf("*q_排序后地址=%d\n",*q);
				printf("*s_排序后=%d\n",*s);
				printf("\n");
				
				printf("*q_排序后值=%s\n",*q);
				printf("*s_排序后值=%s\n",*s);
				printf("\n");
			}
		}
		for (int i = 0; i < 5; i++)
		{ 
			printf("*p[%d]=%s\n",i, *(p+i) );
		}
		printf("\n");
	}
}
int main()
{ 
	char *a[5],  **p;
	char b[5][100];
	int i;
	for (i = 0; i < 5; i++)
		a[i] = b[i];   //将第i个字符串的首地址赋值予指针数组a的第i个元素 
	printf("请依次输入五个字符串:\n");
	for (i = 0; i < 5; i++)
		scanf("%s", a[i]);
	p = a;
	sort(p);
	printf("排序后输出为:\n");
	for (i = 0; i < 5; i++)
	{ 
		printf("%s\n", a[i]);
	}
	system("pause");
	return 0;

}

21.用指向指针的指针方法对输入的n个整数排序并输出.

#include<stdio.h>

void sort(int **p,int n){ 
	int i,j,*temp;
	for(i = 0;i < n-1;i++)
		for(j = n-1;j > i;j--){ 
			if( **(p+j-1) > **(p+j) ){  //*p表示数组的地址,* *p表示取数组地址的值.
				temp = *(p+j-1);
				*(p+j-1) = *(p+j);
				*(p+j) = temp;
			}
		}
} 

int main(){ 
	int i,n,*pstr[20],**p;
	int a[20]={ 34,98,56,12,22,65,1};//n=7
	printf("请输入n:\n");
	scanf("%d",&n);
	printf("排序前:\n"); 
	for(i = 0;i < n;i++){ 
		pstr[i] = &a[i];
		printf("%d ",a[i]);
	}
	p = pstr;
	sort(p,n); //改变的是指针数组*pstr[]里面存放 a[]数组的地址 的顺序 
	printf("\n排序后:\n"); 
	for(i = 0;i < n;i++)
		printf("%d ",*pstr[i]); 
	//printf("%d ",a[i]); //a[i]数组的值位置没有发生变化 
	
} 
    原文作者:创不了浩
    原文地址: https://blog.csdn.net/qq_41398619/article/details/105349785
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞