053.通过指针变量访问整型变量
#include<stdio.h>
int main()
{
int a=100,b=10;//定义整型变量,并初始化
int *pointer_1, *pointer_2;//定义指向整形数据的指针变量pointer_1,pointer_2
pointer_1 = &a;//把变量a的地址赋给指针变量pointer_1
pointer_2 = &b;//把变量b的地址赋给指针变量pointer_2
printf("a=%d,b=%d\n",a,b);//输出a,b的值
printf("*pointer_1=%d,*pointer_2=%d\n",*pointer_1,*pointer_2); //输出a,b的值
return 0;
}
/*note1:第四行的*pointer_1,*pointer_2分别代表定义两个指针变量pointer_1,pointer_2
而最后的输出语句中的*pointer_1,*pointer_2分别代表指针变量pointer_1,pointer_2所指向的变量,也就是变量a和b
note2:指针变量的类型用来指定指定此指针变量可以指向的变量的类型
*/
054.输入两个整数,按先大后小的顺序输出a和b.
#include<stdio.h>
int main()
{
int *p1,*p2,*p,a,b;
printf("please enter two integer numbers:");
scanf("%d,%d",&a,&b);
p1 = &a;
p2 = &b;
if(a<b)
{
p1=&b;
p2=&a;
}
//下面注释代码作用同上
// if(a<b){
// p = p1;
// p1 = p2;
// p2 = p;
// }
printf("max = %d,min = %d",*p1,*p2);
return 0;
}
055.同54题,但是本题要求通过定义一个函数来实现值的交换。
#include<stdio.h>
int main()
{
void swap(int *p1,int *p2);
int *pointer_1,*pointer_2,a,b;
printf("please enter two integer numbers:");
scanf("%d,%d",&a,&b);
pointer_1 = &a;
pointer_2 = &b;
if(a<b)
{
swap(pointer_1,pointer_2);
}
printf("max = %d,min = %d",a,b);
return 0;
}
//原理和54题不同
void swap(int *p1,int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
056.输入3个整数。实现从大到小输出。
#include<stdio.h>
int main()
{
void swap(int *p1,int *p2,int *p3);
int *pointer_1,*pointer_2,*pointer_3,a,b,c;
printf("please enter two integer numbers:");
scanf("%d,%d,%d",&a,&b,&c);
pointer_1 = &a;
pointer_2 = &b;
pointer_3 = &c;
swap(pointer_1,pointer_2,pointer_3);
printf("max = %d,mid = %d,min = %d",a,b,c);
return 0;
}
void swap(int *p1,int *p2,int *p3)
{
void swap_2(int *p1,int *p2);
if(*p1<*p2)
{
swap_2(p1,p2);
}
if(*p1<*p3)
{
swap_2(p1,p3);
}
if(*p2<*p3)
{
swap_2(p2,p3);
}
}
void swap_2(int *p1,int *p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
057.有一个整型数组a,有10个元素,要求输出数组中的全部元素
分析:三种方法
1.下标法:
#include<stdio.h>
int main()
{
int i,a[10];
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<10;i++)
{
printf("%3d",a[i]);
}
return 0;
}
2.通过数组名找出元素地址,找出元素的值。
#include<stdio.h>
int main()
{
int i,a[10];
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
//或者可以写成:scanf("%d",a+i);
}
for(i=0;i<10;i++)
{
printf("%3d",*(a+i));
}
return 0;
}
3.用指针变量指向数组元素。
#include<stdio.h>
int main()
{
int i,a[10];
int *p;
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
/*循环获取值还可以用下面代码
for(p=a;p<(a+10);p++)
{
scanf("%d",p);
}
*/
for(p=a;p<a+10;p++)
{
printf("%3d",*p);
}
return 0;
}
058.通过指针变量输出整型数组a的10个元素。
#include<stdio.h>
int main()
{
int i,a[10];
int *p=a;
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
{
scanf("%d",p++);
}
//这里要重新使p指向a[0],因为经过上面的循环p已经指向数组的末尾
p=a;
for(i=0;i<10;i++,p++)
{
printf("%3d",*p);
}
//上面的循环还可以写成下面的
/*
for(i=0;i<10;i++)
{
printf("%3d",p[i]);
}
*/
return 0;
}
059.将数组a中n个整数按相反顺序存放。
#include<stdio.h>
int main()
{
void inv(int x[],int n);
int a[]={3,6,9,12,15,18,21,24};
int i;
printf("the original array:\n");
for(i=0;i<8;i++)
{
printf("%3d",a[i]);
}
printf("\n");
inv(a,8);
printf("the array has been inverted:\n");
for(i=0;i<8;i++)
{
printf("%3d",a[i]);
}
return 0;
}
void inv(int x[],int n)
{
int temp,i,j,m=n/2;
for(i=0;i<m;i++)
{
j = n-1-i;
temp = x[i];
x[i] = x[j];
x[j] = temp;
}
}
060.(同59题)形参用指针变量
#include<stdio.h>
int main()
{
void inv(int *x,int n);
int a[]={3,6,9,12,15,18,21,24};
int i;
printf("the original array:\n");
for(i=0;i<8;i++)
{
printf("%3d",a[i]);
}
printf("\n%d,%d",&a[0],&a[7]);//观察地址
printf("\n");
inv(a,8);
printf("the array has been inverted:\n");
for(i=0;i<8;i++)
{
printf("%3d",a[i]);
}
printf("\n%d,%d",&a[0],&a[7]);//观察地址
return 0;
}
void inv(int *x,int n)
{
int *p,temp,*i,*j,m=n/2;
i=x;
j=x+n-1;
p=x+m;
for(;i<p;i++,j--)
{
temp = *i;
*i = *j;
*j = temp;
}
}
061.(同60题)用指针变量做实参
#include<stdio.h>
int main()
{
void inv(int *x,int n);
int a[]={3,6,9,12,15,18,21,24};
int i,*p=a;
printf("the original array:\n");
for(i=0;i<8;i++)
{
printf("%3d",*(p+i));
}
printf("\n%d,%d",&a[0],&a[7]);
printf("\n");
inv(p,8);
printf("the array has been inverted:\n");
for(p=a;p<a+8;p++)
{
printf("%3d",*p);
}
printf("\n%d,%d",&a[0],&a[7]);
return 0;
}
void inv(int *x,int n)
{
int *p,temp,*i,*j,m=n/2;
i=x;
j=x+n-1;
p=x+m;
for(;i<p;i++,j--)
{
temp = *i;
*i = *j;
*j = temp;
}
}
062.用指针的方法对10个整数按照由大到小顺序排序。
#include<stdio.h>
int main()
{
void sort(int *p,int n);
int a[10];
int i,*p;
p = a;
printf("please enter 10 integer numbers:");
for(i=0;i<10;i++)
{
scanf("%d",p+i);
}
printf("\n");
sort(p,10);
for(i=0;i<10;i++)
{
printf("%3d",*(p+i));
}
return 0;
}
void sort(int *p,int n)
{
int i,j,temp;
for(i=0;i<n-1;i++)
{
for(j=i+1;j<n;j++)
{
if(*(p+i)<*(p+j))
{
temp = *(p+i);
*(p+i) = *(p+j);
*(p+j) = temp;
}
}
}
}
Note:更优解⬇:⭐⭐⭐⭐⭐
分析:相对于上面的排序优点:交换次数变少(假如n个数。上面交换次数最多为:(n-1)n/2,下面最多为:n-1 )
void sort(int *x,int n)
{
int i,j,k,t;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(*(x+j)>*(x+k))
{
k=j;
}
}
if(i!=k)
{
t = *(x+i);
*(x+i) = *(x+k);
*(x+k) = t;
}
}
}
063.输出二维数组的有关数据(地址和元素的值)
#include<stdio.h>
int main()
{
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
printf("%d,%d\n",a,*a);//0行起始地址,0行0列元素地址
printf("%d,%d\n",a[0],*(a+0));// 0行0列元素地址
printf("%d,%d\n",&a[0],&a[0][0]);// 0行首元素地址,0行0列元素地址
printf("%d,%d\n",a[1],a+1);//1行0列元素地址,1行首地址
printf("%d,%d\n",&a[1][0],*(a+1)+0);//1行0列元素地址
printf("%d,%d\n",a[2],*(a+2));//2行0列元素地址,
printf("%d,%d\n",&a[2],a+2);//2行起始地址
printf("%d,%d\n",a[1][0],*(*(a+1)+0));// 1行0列元素的值
printf("%d,%d\n",*a[2],*(*(a+2)+0));// 2行0列元素的值
return 0;
}
064.有一个3*4的二维数组,要求用指向元素的指针变量输出二维数组各个元素的值。
#include<stdio.h>
int main()
{
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int *p,i,j;
p = a;
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{
printf("%3d",*(*(a+i)+j));
}
printf("\n");
}
return 0;
}
方法二:
#include<stdio.h>
int main()
{
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int *p,i,j;
for(p=a[0];p<a[0]+12;p++)
{
if((p-a[0]) % 4 == 0)
{
printf("\n");
}
printf("%3d",*p);
}
return 0;
}
065.一维数组和二维数组的比较
#include<stdio.h>
int main()
{
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int *p=a[0],(*p1)[4];
p=p+4;
p1=a;
printf("%d,%d,%d,%d,%d\n",a[0],p,p-a[0],*p,p1+1);//6422196,6422212,4,5,6422212
int a2[] = {1,2,3,4,5,6,7,8};
int *p2=&a2[0];
p2=p2+4;
printf("%d,%d,%d,%d",&a2[0],p2,p2-&a2[0],*p2);//6422164,6422180,4,5
return 0;
}
066.输出二维数组任一行任一列元素的值。(指向一维数组的指针变量解题,或者使用指向数组元素的指针变量(i*4+j来定位))
#include<stdio.h>
int main()
{
int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4],i,j;
p=a;
printf("please enter row and column:");
scanf("%d,%d",&i,&j);
printf("%d",*(*(p+i)+j));
return 0;
}
067.有一个班,3个学生,各学4门课,计算总平均分数以及第n个学生的成绩。
#include<stdio.h>
int main()
{
void average(float *p,int n);
void search(float (*p)[4],int i);
float score[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int n;
printf("please enter number of student:");
scanf("%d",&n);
average(*score,12);
search(score,n);
return 0;
}
void average(float *p,int n)
{
float *p_end = p+n-1;
float sum=0,aver;
for(;p<p_end;p++)
{
sum += *p;
}
aver = sum/n;
printf("class average is %3.1f",aver);
}
//i的取值为1,2,3
void search(float (*p)[4],int i)
{
int j;
for(j=0;j<4;j++)
{
printf("%6.1f",*(*(p+i-1)+j));
}
}
068.在上题问题的基础上。查找一门以上课程不及格的学生。输出他们全部课程的成绩。
#include<stdio.h>
int main()
{
void search(float (*p)[4],int n);
float score[][4] = {1,2,3,4,5,6,7,8,69,60,61,62};
search(score,3);
return 0;
}
void search(float (*p)[4],int n)
{
int j,i,flag;
for(j=0;j<3;j++)
{
flag =0;
for(i=0;i<4;i++)
{
if(*(*(p+j)+i)<60)
{
flag =1;
}
}
if(flag == 1)
{
printf("No%d,scores is:",j+1);
for(i=0;i<4;i++)
{
printf("%5.1f",*(*(p+j)+i));
}
printf("\n");
}
}
}
069.定义一个字符数组,在其中存放字符串“I love China!”,输出该字符串和第八个字符。
#include<stdio.h>
int main()
{
char string[] = "I love China!";
printf("%s\n",string);
printf("%c\n",string[7]);
return 0;
}
070.同69题,但是用指针。
#include<stdio.h>
int main()
{
char *string = "I love China!";
printf("%s\n",string);
printf("%c",*(string+7));
return 0;
}
071.将字符串a复制为字符串b,然后输出字符串b
#include<stdio.h>
int main()
{
char a[] = "I love China!",b[20];
int i;
for(i=0;a[i]!='\0';i++)
{
//或者:*(b+i) = *(a+i);
b[i] = a[i];
}
//或者:*(b+i) = '\0';
b[i] = '\0';
printf("%s\n",b);
return 0;
}
072.同71,这里用指针变量处理
#include<stdio.h>
int main()
{
char a[] = "I love China!",b[20],*p1,*p2;
p1=a,p2=b;
for(;*p1 != '\0';p1++,p2++)
{
*p2 = *p1;
}
*p2 = '\0';
printf("%s\n",a);
printf("%s\n",b);
return 0;
}
073.用函数调用实现字符串的复制
方法一:
#include<stdio.h>
int main()
{
void copy_string(char from[],char to[]);
char a[] = "I love China!",b[20];
copy_string(a,b);
printf("%s\n",a);
printf("%s\n",b);
return 0;
}
//第一种:用字符数组名做函数参数
void copy_string(char from[],char to[])
{
int i;
for(i=0;from[i]!='\0';i++)
{
to[i] = from[i];
}
to[i] = '\0';
}
0731.方法二:
#include<stdio.h>
int main()
{
void copy_string(char from[],char to[]);
char a[] = "I love China!",b[20],*p,*q;
p=a;
q=b;
copy_string(p,q);
printf("%s\n",a);
printf("%s\n",b);
return 0;
}
//第二种:用字符指针变量做形参和实参
void copy_string(char from[],char to[])
{
char *p1,*p2;
p1 = from;
p2 = to;
for(;*p1 != '\0'; p1++,p2++)
{
*p2 = *p1;
}
*p2 = '\0';
}
//第三种: 数组做形参,指针变量做实参-------即第一种的主函数和第二种自定义函数的结合体
074.73题的改进
void copy_string(char *from,char *to)
{
while((*to = *from)!='\0')
{
to++;
from++;
}
}
void copy_string(char *from,char *to)
{
while((*to++ = *from++)!='\0');
}
void copy_string(char *from,char *to)
{
while(*from!='\0')
{
*to++ = *from++;
}
*to = '\0';
}
void copy_string(char *from,char *to)
{
while(*to++ = *from++);
}
075.改变指针变量的值
#include<stdio.h>
int main()
{
char *a = "I Love China!";
a = a+7;
printf("%s\n",a);
return 0;
}
076.用函数求整数a,b中的最大者。(通过函数名调用)
#include<stdio.h>
int main()
{
int max(int x, int y);
int a,b,c;
printf("please enter a and b:");
scanf("%d,%d",&a,&b);
c = max(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
return 0;
}
int max(int x, int y)
{
return (x>y? x:y);
}
077.用函数求整数a,b中的最大者。(通过指针变量调用它所指向的函数)
#include<stdio.h>
int main()
{
int max(int x, int y);
int a,b,c;
int (*p)(int,int);
p = max;
printf("please enter a and b:");
scanf("%d,%d",&a,&b);
c = (*p)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
return 0;
}
int max(int x, int y)
{
return (x>y? x:y);
}
078.输入两个整数,然后让用户选择1或2,选1时调用max函数,输出二者中的大数,选2时调用min函数,输出二者中的小数。
#include<stdio.h>
int main()
{
int max(int x, int y);
int min(int x, int y);
int a,b,c,n;
int (*p)(int,int);
printf("please enter a and b:");
scanf("%d,%d",&a,&b);
printf("please choose 1 or 2:");
scanf("%d",&n);
if(n==1)
{
p=max;
c = (*p)(a,b);
printf("a=%d,b=%d,max=%d",a,b,c);
}
else if(n==2)
{
p=min;
c = (*p)(a,b);
printf("a=%d,b=%d,min=%d",a,b,c);
}
return 0;
}
int max(int x, int y)
{
return (x>y? x:y);
}
int min(int x, int y)
{
return (x<y? x:y);
}
079.有两个整数a和b,由用户输入1,2或3.输入1,程序给出a和b中的大者,输入2,就给出a和b中的小者。输入3,则求a与b之和。
#include<stdio.h>
int main()
{
int fun(int x, int y, int (*p)(int,int));
int max(int x, int y);
int min(int x, int y);
int add(int x, int y);
int a,b,c,n;
printf("please enter a and b:");
scanf("%d,%d",&a,&b);
printf("please choose 1 or 2 or 3:");
scanf("%d",&n);
if(n==1)
{
fun(a,b,max);
}
else if(n==2)
{
fun(a,b,min);
}
else
{
fun(a,b,add);
}
return 0;
}
int fun(int x, int y, int (*p)(int,int))
{
(*p)(x,y);
}
int max(int x, int y)
{
int z;
z= x>y? x:y;
printf("max=%d",z);
return z;
}
int min(int x, int y)
{
int z;
z= x<y? x:y;
printf("min=%d",z);
return z;
}
int add(int x, int y)
{
int z;
z= x+y;
printf("sum=%d",z);
return z;
}
080.有a个学生,每个学生有b门课程的成绩。要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数实现。
#include<stdio.h>
int main()
{
float *search(float (*pointer)[4],int n);
float score[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
float *p;
int n,i;
printf("please enter number of student:");
scanf("%d",&n);
p = search(score,n);
for(i=0;i<4;i++)
{
printf("%5.1f",*(p+i));
}
return 0;
}
float *search(float (*pointer)[4],int n)
{
float *pt;
pt = *(pointer+n);
return pt;
}
081.对上一题找出其中不及格的课程的学生及其学生号。
#include<stdio.h>
int main()
{
float *search(float (*pointer)[4]);
float score[][4] = {{1,2,3,4},{5,6,7,80},{90,100,110,120}};
float *p;
int i,j;
for(i=0;i<3;i++)
{
p = search(score+i);
if(p !=NULL)
{
printf("No.%d score:",i);
for(j=0;j<4;j++)
{
printf("%5.1f",*(p+j));
}
printf("\n");
}
}
return 0;
}
float *search(float (*pointer)[4])
{
int i;
float *pt;
pt = NULL;
for(i=0;i<4;i++)
{
if(*(*pointer+i) < 60)
{
pt = *pointer;
}
}
return pt;
}
082.将若干字符串按照字母顺序(由小到大)输出。
#include<stdio.h>
#include<string.h>
int main()
{
void sort(char *name[],int n);
void print(char *name[],int n);
char *name[] = {"basic","python","c","go","javascript"};
sort(name,5);
print(name,5);
return 0;
}
void sort(char *name[],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(strcmp(name[j], name[k])<0)
{
k=j;
}
}
if(k!=i)
{
temp = name[i];
name[i] = name[k];
name[k] = temp;
}
}
}
void print(char *name[],int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%15s",name[i]);
}
}
输出函数改进
void print2(char *name[],int n)
{
int i = 0;
char *p;
p = name[0];
while(i<n)
{
p=*(name+i++);
printf("%s\n",p);
}
}
★★★★非零值都为逻辑真,零为逻辑假
83.指向指针数据的指针变量。
#include<stdio.h>
#include<string.h>
int main()
{
char *name[] = {"basic","python","c","go","javascript"};
char **p;
int i;
for(i=0;i<5;i++)
{
p = name + i;
printf("%s\n",*p);
}
return 0;
}
084.有一个指针数组,其元素分别指向一个整型数组的元素,用指向指针数据的指针变量,输出整型数组各元素的值。
#include<stdio.h>
#include<string.h>
int main()
{
int a[5] = {1,3,5,7,9};
int * name[5] = {&a[0],&a[1],&a[2],&a[3],&a[4]};
int **p, i;
p = name;
for(i=0;i<5;i++)
{
printf("%3d",**(p+i));
}
return 0;
}
085.建立动态数组,输入5个学生的成绩,另外用一个函数检查其中有无低于60分的,输出不合格的成绩。
#include<stdio.h>
#include<stdlib.h>
int main()
{
void check(int *p);
int *p1,i;
p1 = (int *)malloc(5*sizeof(int));//其实这里会自定转换,不人位转换也可以
for(i=0;i<5;i++)
{
scanf("%d",p1+i);
}
check(p1);
return 0;
}
void check(int *p)
{
int i;
for(i=0;i<5;i++)
{
if(*(p+i)<60)
{
printf("%d\n",*(p+i));
}
}
}