猴博士指针学习

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.返回指针值的函数

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页