栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

07—指针(上)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

07—指针(上)

写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友。

目录

指针

1.指针变量与普通变量2.指针变量与一维数组3.指针变量与一维数组相关函数4.指针变量与二维数组5.指针变量与二维数组相关函数


指针 1.指针变量与普通变量
指针=&变量
*指针=指针指定的变量的值




实现p、q的值互换



例1

//不改变a,b的值,通过指针实现功能
#include
int main()
{
	int a,b,*p,*q,*r;
	printf("请输入两个整数:n");
	scanf_s("%d,%d", &a,&b);
	p = &a;
	q = &b;
	if (a < b)
	{
		r = p;
		p = q;
		q = r;
	}
	printf("较大数为%d  较小数为%dn",*p,*q);
	return 0;
}
//改变a,b值,以a,b输出
#include
int main()
{
	int a,b,*p,*q,t;
	printf("请输入两个整数:n");
	scanf_s("%d,%d", &a,&b);
	p = &a;
	q = &b;
	if (a < b)
	{
		t = *p;
		*p = *q;
		*q = t;
	}
	printf("较大数为%d  较小数为%dn",a,b);
	return 0;
}
2.指针变量与一维数组
指针=&数组名[某数]
*指针=指针指定的变量的值
指针+i=&数组名[某数+i]

*p=*p*2;
*(q+1)=*p*2;

例2

//常规思路
#include
int main()
{
	int a[5];
	int i;
	printf("请输入5个整数:n");
	for (i = 0; i <= 4; i++)
	{
		scanf_s("%d", &a[i]);
		a[i] = a[i] * 2;
	}
	printf("加倍后的各整数为:n");
	for (i = 0; i <= 4; i++)
		printf("%dt",a[i]);
	printf("n");
	return 0;
}
//用指针来实现这个程序
#include
int main()
{
	int a[5];
	int i,*p;
	p = &a[0];                 // p = &a[0];   &a[i]=p+i;
	printf("请输入5个整数:n");
	for (i = 0; i <= 4; i++)
	{
		scanf_s("%d", p+i);    
		*(p+i) = *(p + i) * 2; // a[i]=*(p + i);
	}
	printf("加倍后的各整数为:n");
	for (i = 0; i <= 4; i++)
		printf("%dt", *(p + i)); // a[i]=*(p + i);
	printf("n");
	return 0;
}
//注意:
for (i = 0; i <= 4; i++)
  printf("%dt", *(p + i));
还可以改写为:
for (p=&a[0]; p <= &a[4]; p++)
  printf("%dt", *p);

//读程序题常考点

&数组名[某数]  相当于  数组名+某数
数组名[某数]   相当于  *(数组名+某数)
p = &a[0];    p=a+0; p=a;
*(p+i) = *(p + i) * 2;   *(a+i) = *(a + i) * 2;   
*(p + i)=*(a + i);
3.指针变量与一维数组相关函数

形参是数组名,实参是数组名
形参是声明、解释函数a[ ]括号里的内容——数组名
实参是使用的时候括号里面的东西。例如:aver()
有时候,编写程序的时候会要求:形参用指针变量或者 实参用指针变量 ;

函数声明:数组名[]→*p;
函数解释:数组名[i]→*(p+i);
函数使用:数组名→q(使用前需先关联);

例3

#include
int main()
{
    //函数声明
	float aver(float a[], int n);  //声明:a[] 形参
	
	float zu1[5],zu2[10];
	int i;
	printf("请输入第1组的学生成绩:n");
	for (i = 0; i <= 4; i++)
		scanf_s("%f", &zu1[i]);
	printf("请输入第2组的学生成绩:n");
	for (i = 0; i <= 9; i++)
		scanf_s("%f", &zu2[i]);
    //函数使用
	printf("第1组的平均分是%fn", aver(zu1,5));  //aver()括号里为实参
	printf("第2组的平均分是%fn", aver(zu2, 10)); //aver() 括号里为实参
	
	return 0;
}

 //函数声明
float aver(float a[], int n)     //解释:a[] 形参

 //函数解释
{
	float sum = a[0], pingjunshu;
	int i;
	for (i = 1; i < n; i++)
		sum = sum + a[i];
	pingjunshu = sum / n;
	return(pingjunshu);
}
//形参变成指针变量,实参变成指针变量
#include
int main()
{
    //函数声明
	float aver(float *p, int n);  //声明:a[] 形参  方法:数组名[]→*p
	
	//函数使用
	float zu1[5],zu2[10];
	int i,*q,*r;                  //定义*q,*r;
	q=&zu1[0];r=&zu2[0];          //q,r和zu1,zu2关联上
	printf("请输入第1组的学生成绩:n");
	for (i = 0; i <= 4; i++)
		scanf_s("%f", q+i);  //&zu1[i]=q+i;
	printf("请输入第2组的学生成绩:n");
	for (i = 0; i <= 9; i++)
		scanf_s("%f", r+i);  //&zu2[i]=r+i;
    //函数使用
	printf("第1组的平均分是%fn", aver(q,5));  //aver()括号里为实参  zu1=q
	printf("第2组的平均分是%fn", aver(r, 10)); //aver() 括号里为实参
zu2=r
	return 0;
}

 //函数声明
float aver(float *p, int n)     //声明:a[] 形参   方法:数组名[]→*p

 //函数解释
{
	float sum = *p, pingjunshu;  //解释:a[0]形参   方法:数组名[i]→*(p+i);
	int i;
	for (i = 1; i < n; i++)
		sum = sum + *(p+i); //解释:a[i]形参   方法:数组名[i]→*(p+i);
	pingjunshu = sum / n;
	return(pingjunshu);
}
4.指针变量与二维数组
指针=&数组名[数a][数b]
*指针=指针指定的变量的值
指针+i=&(数组名[数a][数b]后面第i个元素)

*p=*p*2;
*(q+1)=*q*2;


练习

#include
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("%dt", *p);
	}
	printf("n");
	return 0;
}

运行结果:

&数组名[数α][数β] 相当于 数组名[数α]+[数β]
                            也相当于 数组名[0]+α*列数+β
数组名[数α][数β] 相当于 *(数组名[数α]+[数β])
#include
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++) 
	//a[0][0]=a[0]+0=a[0];  a[2][3]=a[0]+2*4+3=a[0]+11;
	//a[2][3]=2;  *(a[2]+3)=2;
   {
		if ((p - &a[0][0]) % 4 == 0)
			printf("n");
		printf("%dt", *p);
	}
	printf("n");
	return 0;
}
5.指针变量与二维数组相关函数

<1>
形参是数组名,实参是数组名
转换为↓
形参是指针变量,实参是数组名

函数声明:数组名[][某数]→*p
函数解释:数组名[i][j]→*(p+i*列数+j)
函数使用:数组名→*数组名


形参是数组名,实参是数组名

#include
int main()
{
	void shuchu(float a[][4], int n);  //形参 都是数组名
	float fenshu[3][4] = { 65,67,70,60,80,87,90,81,90,99,93,98 };
	shuchu(fenshu, 12);
	return 0;
}
void shuchu(float a[][4], int n)     //形参 都是数组名
{
	float sum = 0;
	int i, j;
	for (i = 0; i <= 2; i++)
		for (j = 0; j <= 2; j++)
			sum = sum = a[i][j];
	printf("三人的总平均分为%fn", sum / n);
}

形参是指针变量,实参是数组名

#include
int main()
{
	void shuchu(float *p, int n);  //函数声明:数组名[][某数]→*p    a[][4]=*p;
	float fenshu[3][4] = { 65,67,70,60,80,87,90,81,90,99,93,98 };
	shuchu(*fenshu, 12);       //函数使用:数组名→*数组名  *fenshu
	return 0;
}
void shuchu(float *p, int n)   //函数声明:数组名[][某数]→*p    a[][4]=*p;
//函数解释
{
	float sum = 0;
	int i;
	for (i = 0; i <= 11; i++)
		sum = sum = *(p + i);  //函数解释: 数组名[i][j]→*(p+i*列数+j); a[i][j]=*(p+i*4+j); 
	printf("三人的总平均分为%fn", sum / n);
}
int i, j;
for (i = 0; i <= 2; i++)
	for (j = 0; j <= 2; j++)
		sum = sum = *(p+i*4+j); 
相当于
int i;
for (i = 0; i <= 11; i++)
		sum = sum = *(p+i); 
//指针不用管行和列,就是排着往后加

<2>
形参是数组名,实参是数组名
转换为↓
形参是指针变量,实参是指针变量

函数声明:数组名[][某数]→*p
函数解释:数组名[i][j]→*(p+i*列数+j)
函数使用:数组名→q(使用前要先关联)
#include
int main()
{
	void shuchu(float *p, int n);  //函数声明:数组名[][某数]→*p    a[][4]=*p;
	float fenshu[3][4] = { 65,67,70,60,80,87,90,81,90,99,93,98 };
	int *q; q = &fenshu[0][0]; //函数使用:数组名→q(使用前要先关联)
	shuchu(q, 12);       
	return 0;
}
void shuchu(float *p, int n)   //函数声明:数组名[][某数]→*p    a[][4]=*p;

//函数解释
{
	float sum = 0;
	int i;
	for (i = 0; i <= 11; i++)
		sum = sum = *(p + i);  //函数解释: 数组名[i][j]→*(p+i*列数+j); a[i][j]=*(p+i*4+j); 
	printf("三人的总平均分为%fn", sum / n);
}


修改后的程序:

#include
int main()
{
	void shuchu(float *p, int n);  
	float fenshu[3][4] = { 65,67,70,60,80,87,90,81,90,99,93,98 };
	float *q; q = &fenshu[0][0];  //int *q;改成 float *p;
	shuchu(q, 12);       
	return 0;
}
void shuchu(float *p, int n)   
{
	float sum = 0;
	int i;
	for (i = 0; i <= 11; i++)
		sum = sum = *(p + i);  a[i][j]=*(p+i*4+j); 
	printf("三人的总平均分为%fn", sum / n);
}

以上是自己通过学习整理所得,大家有相关问题,可以留言,一起交流学习!

转载或者引用本文内容请注明来源及原作者

参考
《C语言》4小时不挂科【猴博士爱讲课】——第4~7课

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/722720.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号