ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

猴博士指针学习

2020-12-02 09:29:07  阅读:200  来源: 互联网

标签:博士 int sum float 学习 数组名 printf 指针


1. 指针变量与普通变量

指针=&变量
*指针=指针确定的变量的值
例题:输入两个整数,按照先大后小的顺序输出两个数,用指针编写程序
代码一:形参是数组名,实参也是数组名类型

// 编译环境DevC++ 
#include<stdio.h>
int main()
{
	int a,b;
	int *p,*q,*r;      //定义两个指针分别指向变量a和变量b 
	scanf("%d %d",&a,&b);
	p = &a,
	q = &b;
	if(a < b)
	{
		r = p;
		p = q;
		q = r;  
	}
	printf("较大的数是:%d 较小的数是%d\n",*p,*q);
	return 0;
}

代码二

// 编译环境DevC++ 
#include<stdio.h>
int main()
{
	int a,b;
	int *p,*q,t;      //定义两个指针分别指向变量a和变量b 
	scanf("%d %d",&a,&b);
	p = &a,
	q = &b;
	if(a < b)
	{
		t = *p;
		*p = *q;
		*q = t;  
	}
	printf("较大的数是:%d 较小的数是%d\n",a,b);
	return 0;
}

输入3,4后的结果:
在这里插入图片描述

2.指针变量与一维数组

用法:
指针=&数组名[某数]
*指针=指针确定的变量的值
指针+i=&数组名[某数+i]
&数组名[某数] 相当于 数组名+某数
数组名[某数] 相当于 *(数组名+某数)
例题:一个整型数组里的5个元素由键盘输入,将每个元素变为原来的2倍再依次输出

#include<stdio.h>
int main()
{
	int a[5];
	int i,*p;
	p = a;//等价于p = &a[0];
	for(i = 0;i < 5;i++)
	{
		scanf("%d",p+i);//等价于scanf("%d",a+i);
		*(p + i) = *(p + i)*2;
	}
	printf("加倍后的数组为:\n");
	for(i = 0;i < 5;i++)
	printf("%d ",*(p + i));//等价于printf("%d ",*(a + i));
	printf("\n");
	/*
	for(i = 0;i < 5;i++)
	printf("%d ",*(p + i));//等价于printf("%d ",*(a + i));
	printf("\n");
	
	等价于
	for(p = &a[0];p <= &a[4];p++) 
	printf("%d\t",*p);
	*/ 
	return 0; 
}

3.指针变量与一维数组相关函数

例题:
有两个小组,分别有5名学生和20名学生,编写程序输入学生的成绩,并调用一个aver函数求两个小组的平均分
代码一:

#include <stdio.h>
int main()
{
	float aver(float a[],int n);
	float zu1[5],zu2[10];
	int i;
	printf("输入第一组的学生:");
	for(i = 0;i < 5;i++)
	scanf("%f",&zu1[i]); 
	printf("输入第二组的学生:");
	for(i = 0;i < 10;i++)
	scanf("%f",&zu2[i]);
	printf("第一组平均分是:%f\n",aver(zu1,5));
	printf("第一组平均分是:%f\n",aver(zu2,10));
	return 0;
}

float aver(float a[],int n)
{
	float sum = a[0],pingjunshu;
	int i;
	for(i = 0;i < n;i++ )
	sum += a[i];
	pingjunshu = sum/n;
	return(pingjunshu);

}

代码二:形参或实参用指针变量
步骤:

  1. 函数声明:数组名[]➡*p。即上面函数中:
. float aver(float a[],int n);
和
float     aver(float a[],int n)
  1. 函数解释:数组名[i]➡*(p+i)即:
 float aver(float a[],int n)
{
	float sum = a[0],pingjunshu;
	int i;
	for(i = 0;i < n;i++ )
	sum += a[i];
	pingjunshu = sum/n;
	return(pingjunshu);

}
  1. 函数使用:数组名➡q(使用前需要先关联) 即:
printf("第一组平均分是:%f\n",aver(zu1,5));
printf("第一组平均分是:%f\n",aver(zu2,10));

2.1 形参变指针变量

//有两个小组,分别有5名学生和20名学生,编写程序输入学生的成绩,并调用
//一个aver函数求两个小组的平均分 

#include <stdio.h>
int main()
{
	float aver(***p**,int n);
	float zu1[5],zu2[10];
	**int i,*q,*r;
	q = &zu1[0];
	r = &zu2[0];**
	printf("输入第一组的学生:");
	for(i = 0;i < 5;i++)
	scanf("%f",&zu1[i]); //scanf("%f",r+i);
	printf("输入第二组的学生:");
	for(i = 0;i < 10;i++)
	scanf("%f",&zu2[i]);//scanf("%f",r+i);
	printf("第一组平均分是:%f\n",aver(**q**,5));
	printf("第一组平均分是:%f\n",aver(**r**,10));
	return 0;
}

float aver(*p,int n)
{
	float sum = ***p**,pingjunshu;
	int i;
	for(i = 0;i < n;i++ )
	**sum += *(p+i);**
	pingjunshu = sum/n;
	return(pingjunshu);

}

4.指针变量与二维数组

方法:

  1. 指针=&数组名[数a][数b]
  2. *指针=指针指定的变量的值
  3. 指针+i=&(数组名[数a][数b] 后面第i个元素)
    例题:已知整形二维数组a[3][4]={1,2,3,4,5,6,6,5,4,3,2,1};用指针变量输出二维数组个元素的值;
#include<stdio.h>
int main()
{
	int a[3][4]={1,2,3,4,5,6,6,5,4,3,2,1}; 
	int *p;
	for(p = &a[0][0];p <= &a[2][3];p++)
	{
		if((p-&a[0][0])%4 == 0)
		printf("\n");
		printf("%d\t",*p);
	}
	printf("\n");
	return 0;
}

结果:
在这里插入图片描述
&数组名[数α][数β] 相当于 数组名[数α]+数β 也相当于 数组名[0]+α*列数+β

数组名[数α][数β] 相当于 *(数组名[数α]+数β)

5.指针变量与二维数组相关函数

例题:有三名学生学习四门课,学生1的成绩是65,67,70,60,学生2的成绩分别是80,87,90,81,学生3是90,99,93,98.将上述成绩输入二维数组,并 通过函数输出三个人的平均成绩
代码一:用普通函数——形参是数组名,实参是数组名

#include<stdio.h>
int main()
{
	void shuchu(float[][4],int n);
	float chengji [3][4]={65,67,70,60,80,87,90,81,90,99,93,98};
	shuchu(chengji ,12);
	return 0;
}
void shuchu(float a[][4],int n)
{
	float sum = 0;
	int i,j;
	for(i = 0;i < 3;i++)
	  for(j = 0;j < 4;j++)
	  sum += a[i][j];
	  printf("三人的总平均成绩为:%.2f",sum/n);
}

代码一:用普通函数——形参指针变量,实参是数组名
变化过程:

  1. 函数声明:数组名[]➡*p;
  2. 函数解释:数组名[i][j]➡*(p+i*列数+j)
  3. 函数使用:数组名➡*p;
#include<stdio.h>
int main()
{
	void shuchu(float*p,int n);
	float chengji [3][4]={65,67,70,60,80,87,90,81,90,99,93,98};
	shuchu(*chengji ,12);
	return 0;
}
void shuchu(float *p,int n)
{
	float sum = 0;
	int i,j;
	for(i = 0;i < 3;i++)
	  for(j = 0;j < 4;j++)
	  sum += ***(p+i*4+j)**;
	  printf("三人的总平均成绩为:%.2f",sum/n);
}

函数体部分也等价于:

void shuchu(float *p,int n)
{
	float sum = 0;
	int i,j;
	for(i = 0;i < 12;i++)
	  	  sum += ***(p+i)**;
	  printf("三人的总平均成绩为:%.2f",sum/n);
}

代码三——形参是指针变量,实参也是指针变量
方法:

  1. 函数声明:数组名[]➡*p;
  2. 函数解释:数组名[i][j]➡*(p+i*列数+j)
  3. 函数使用:数组名➡q(使用前要先关联);
#include<stdio.h>
int main()
{
	void shuchu(float*p,int n);
	float chengji [3][4]={65,67,70,60,80,87,90,81,90,99,93,98};
	float *q;
	q=&chengji[0][0];
	shuchu(q ,12);
	return 0;
}
void shuchu(float *p,int n)
{
	float sum = 0;
	int i,j;
	for(i = 0;i < 3;i++)
	  for(j = 0;j < 4;j++)
	  sum += *(p+i*4+j);
	  printf("三人的总平均成绩为:%.2f",sum/n);
}

10 指针变量与函数

#include<stdio.h>
int main()
{
	int max(int x,int y);
	int a,b;
	scanf("%d%d",&a,&b);
	printf("%d\n",max(a,b));
	return 0;
}

int max(int x,int y)
{
	return (x>y?x:y);
}

用指针指向函数:

#include<stdio.h>
int main()
{
	int max(int x,int y);
	int a,b;
	int (*p)(int,int);
	p = max;
	scanf("%d%d",&a,&b);
	printf("%d\n",(*p)(a,b));
	return 0;
}

int max(int x,int y)
{
	return (x>y?x:y);
}

11.返回指针值的函数

标签:博士,int,sum,float,学习,数组名,printf,指针
来源: https://blog.csdn.net/qq_42724075/article/details/110451936

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有