IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 08—指针(全) -> 正文阅读

[C++知识库]08—指针(全)

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


指针

1.指针变量与普通变量

指针=&变量
*指针=指针指定的变量的值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
实现p、q的值互换
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
例1
在这里插入图片描述

//不改变a,b的值,通过指针实现功能
#include<stdio.h>
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  较小数为%d\n",*p,*q);
	return 0;
}
//改变a,b值,以a,b输出
#include<stdio.h>
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  较小数为%d\n",a,b);
	return 0;
}

2.指针变量与一维数组

指针=&数组名[某数]
*指针=指针指定的变量的值
指针+i=&数组名[某数+i]

在这里插入图片描述

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

在这里插入图片描述

例2
在这里插入图片描述

//常规思路
#include<stdio.h>
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("%d\t",a[i]);
	printf("\n");
	return 0;
}
//用指针来实现这个程序
#include<stdio.h>
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("%d\t", *(p + i)); // a[i]=*(p + i);
	printf("\n");
	return 0;
}
//注意:
for (i = 0; i <= 4; i++)
  printf("%d\t", *(p + i));
还可以改写为:
for (p=&a[0]; p <= &a[4]; p++)
  printf("%d\t", *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<stdio.h>
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组的平均分是%f\n", aver(zu1,5));  //aver()括号里为实参
	printf("第2组的平均分是%f\n", 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<stdio.h>
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组的平均分是%f\n", aver(q,5));  //aver()括号里为实参  zu1=q
	printf("第2组的平均分是%f\n", 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<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]+α*列数+β
数组名[数α][数β] 相当于 *(数组名[数α]+[数β])
#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++) 
	//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("%d\t", *p);
	}
	printf("\n");
	return 0;
}

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

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

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

在这里插入图片描述
形参是数组名,实参是数组名

#include<stdio.h>
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("三人的总平均分为%f\n", sum / n);
}

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

#include<stdio.h>
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("三人的总平均分为%f\n", 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<stdio.h>
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("三人的总平均分为%f\n", sum / n);
}

在这里插入图片描述
修改后的程序:

#include<stdio.h>
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("三人的总平均分为%f\n", sum / n);
}

6.指针变量指向二维数组的行变量

在这里插入图片描述
在这里插入图片描述
例4
在这里插入图片描述

#include<stdio.h>
int main()
{
	int a[3][3] = { {1,2,3},{4,5,6,},{7,8,9} };
	int(*p)[3];
	p = a;  //这两句=*(*(p+i)+j)=a[i][j]
	int i, j, hang, lie;
	printf("请输入行数与列数:\n");
	scanf_s("%d,%d", &hang, &lie);
	i = hang - 1;
	j = lie - 1;
	printf("%d行%d列的元素为%d\n", hang, lie, *(*(p + i) + j));
	return 0;
}

7.用指向二维数组行变量的指针变量做形参

例5
在这里插入图片描述

//常规思路
#include<stdio.h>
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,2);
	return 0;
}
void shuchu(float a[][4], int n)
{
	int i;
	printf("第%d个学生的各科成绩是:\n", n);
		for (i = 0; i <= 3; i++)
			printf("%f\t", a[n - 1][i]);
	printf("\n");
}
函数声明:数组名[][某数]→(*p)[某数]
函数解释:数组名[i][j]→*(*(p+i)+j)
函数使用:数组名→*数组名
//形参变成指针变量
#include<stdio.h>
int main()
{
	void shuchu(float (*p)[4], int n);    //函数声明:数组名[][某数]→(*p)[某数]    a[][4]→(*p)[4]
	float fenshu[3][4] = { {65,67,70,60},{80,87,90,81},{90,99,93,98} };
	shuchu(fenshu, 2);
	return 0;
}
void shuchu(float (*p)[4], int n)        //函数声明:数组名[][某数]→(*p)[某数]    a[][4]→(*p)[4]
{
	int i;
	printf("第%d个学生的各科成绩是:\n", n);
	for (i = 0; i <= 3; i++)
		printf("%f\t", *(*(p + n - 1) + i));     //函数解释:数组名[i][j]→*(*(p + i) + j)  a[n - 1][i]→*(*(p + n-1) + i)
	printf("\n");
}

8.指针变量与字符串

指针=&数组名[某数]
*指针=指针指定的字符
指针+i=&数组名[某数+i]

例6
在这里插入图片描述

#include<stdio.h>
int main()
{
	int i;
	char a[], b[10086];
	a[] = { 'I',' ','a','m',' ','s','h','u','a','i','b','i','!' };
	for (i = 0; a[i] != '\0'; i++)
		b[i] = a[i];
	b[i + 1] = '\0';
	printf("字符串b是:\n");
	for (i = 0; b[i] != '\0'; i++)
		printf("%c",b[i]);
	printf("\n");
	return 0;
}
#include<stdio.h>
int main()
{
	int i;
	char a[], b[10086],*p,*q;
	a[] = { 'I',' ','a','m',' ','s','h','u','a','i','b','i','!' };
	p = &a[0]; q = &b[0];
	for (i = 0; *(p + i) != '\0'; i++)
		*(q + i) = *(p + i);
		*(q + i+1) = '\0';
	printf("字符串b是:\n");
	for (i = 0; *(q + i) != '\0'; i++)
		printf("%c", *(q + i));
	printf("\n");
	return 0;
}
&数组名[某数]  相当于  数组名+某数
数组名[某数]   相当于  *(数组名+某数)
p = &a[0];   q = &b[0];
p = a;       q = b;

9.指针变量与字符串相关函数

在这里插入图片描述
<1>
形参是数组名,实参是数组名

#include<stdio.h>
int main()
{
	void fuzhi(char yuanlaide[],char xinde[]);
	int i;
	char b[10086];
	char a[] = { 'I',' ','a','m',' ','s','h','u','a','i','b','i','!' };
	printf("字符串b是:\n");
	fuzhi(a, b);
	for (i = 0; b[i]!= '\0'; i++)
		printf("%c", b[i]);
	printf("\n");
	return 0;
}
void fuzhi(char yuanlaide[], char xinde[])
{
	int i;
	for (i = 0; yuanlaide[i] != '\0'; i++)
		xinde[i] = yuanlaide[i];
	xinde[i + 1] = '\0';
}

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

函数声明:数组名[]→*p
函数解释:数组名[i]→*(p+i)
函数使用:数组名→q(使用前需先关联)
#include<stdio.h>
int main()
{
	void fuzhi(char *yuanlaidep, char *xindep); //函数声明:数组名[]→*p
	int i;
	char b[10086];
	char a[] = { 'I',' ','a','m',' ','s','h','u','a','i','b','i','!' };
	printf("字符串b是:\n");
	fuzhi(a, b);
	for (i = 0; b[i] != '\0'; i++)
		printf("%c", b[i]);
	printf("\n");
	return 0;
}
void fuzhi(char *yuanlaidep, char *xindep)  //函数声明:数组名[]→*p
{
	int i;
	for (i = 0; *(yuanlaidep+i)!= '\0'; i++)  //函数解释:数组名[i]→*(p + i)
		*(xindep+i) = *(yuanlaidep + i);
	*(xindep + i+1) = '\0';
}

<3>
形参是指针变量,实参是指针变量

函数声明:数组名[][某数]→*p
函数解释:数组名[i][j]→*(p+i*列数+j)
函数使用:数组名→q(使用前要先关联)
#include<stdio.h>
int main()
{
	void fuzhi(char *yuanlaidep, char *xindep); //函数声明:数组名[]→*p
	int i;
	char b[10086];
	char a[] = { 'I',' ','a','m',' ','s','h','u','a','i','b','i','!' };
	char *yuanlaidep,*xindeq;   //定义指针变量
	yuanlaidep=&a[0];xindeq=&b[0]; //变量、指针先关联
	printf("字符串b是:\n");
	fuzhi(yuanlaidep, xindeq);  //函数使用:数组名→q(使用前要先关联)
	for (i = 0; *(xindeq+i) != '\0'; i++)  //b[i]=*(xindeq+i)
		printf("%c", *(xindeq+i));
	printf("\n");
	return 0;
}
void fuzhi(char *yuanlaidep, char *xindep)  //函数声明:数组名[]→*p
{
	int i;
	for (i = 0; *(yuanlaidep+i)!= '\0'; i++)  //函数解释:数组名[i]→*(p + i)
		*(xindep+i) = *(yuanlaidep + i);
	*(xindep + i+1) = '\0';
}
char a[] ;
a[]={ 'I',' ','a','m',' ','s','h','u','a','i','b','i','!' };
char *yuanlaidep;
yuanlaidep=&a[0];
可以简化为:
yuanlaidep ="I am shuaibi!";

10.指针变量与函数

例7
在这里插入图片描述

#include<stdio.h>
int main()
{
	int max(int x, int y);
	int a, b;
	printf("请输入两个整数:\n");
	scanf_s("%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;
	printf("请输入两个整数:\n");
	scanf_s("%d,%d", &a, &b);
	printf("较大数是:%d\n", (*p)(a,b));    //(*p)(a,b)→max(a,b)
	return 0;
}
int max(int x, int y)
{
	return(x > y ? x : y);
}

例8
在这里插入图片描述

#include<stdio.h>
int main()
{
	int max(int x, int y);
	int min(int x, int y);
	int a, b,xuanze;
	printf("请输入俩整数:\n");
	scanf_s("%d,%d", &a, &b);
	printf("请输入1或2:");
	scanf_s("%d", &xuanze);
	if(xuanze==1)
		printf("结果为:%d\n",max(a, b));
	else if (xuanze == 2)
		printf("结果为:%d\n", min(a, b));
	else
		printf("您选的不对!");
	return 0;
}
int max(int x, int y)
{
	return(x > y ? x : y);
}
int min(int x, int y)
{
	return(x < y ? x : y);
}
//指针
#include<stdio.h>
int main()
{
	int max(int x, int y);
	int min(int x, int y);
	int (*p)(int, int);   //定义指针
	int a, b, xuanze;
	printf("请输入俩整数:\n");
	scanf_s("%d,%d", &a, &b);
	printf("请输入1或2:");
	scanf_s("%d", &xuanze);
	if (xuanze == 1)
		p = max;
	else if (xuanze == 2)
		p = min;
	else
		printf("您选的不对!");
	printf("结果为%d\n", (*p)(a,b));  //(*p)(a,b)
	return 0;
}
int max(int x, int y)
{
	return(x > y ? x : y);
}
int min(int x, int y)
{
	return(x < y ? x : y);
}

11.返回指针值的函数

在这里插入图片描述
在这里插入图片描述

#include<stdio.h>
int main()
{
	float *chazhao(float (*hang)[4], int n);
	float a[3][4] = { {65,67,70,60},{80,87,90,81},{90,99,93,98} };
	float *p;
	int xuhao, i;
	printf("请输入学生序号:");
	scanf_s("%d", &xuhao);
	printf("第%d名学生的成绩:\n",xuhao);
	p = chazhao(a, xuhao - 1);
	for (i = 0; i <= 3; i++)
		printf("%f\t", *(p + i));
	printf("\n");
	return 0;
}
float *chazhao(float (*hang)[4], int n)
{
	int *q;
	q = (hang + n)[0];
	return(q);
} 

运行结果:
在这里插入图片描述

#include<stdio.h>
int main()
{
	float *chazhao(float (*hang)[4], int n);
	float a[3][4] = { {65,67,70,60},{80,87,90,81},{90,99,93,98} };
	float *p;
	int xuhao, i;
	printf("请输入学生序号:");
	scanf_s("%d", &xuhao);
	printf("第%d名学生的成绩:\n",xuhao);
	p = chazhao(a, xuhao - 1);
	for (i = 0; i <= 3; i++)
		printf("%f\t", *(p + i));
	printf("\n");
	return 0;
}
float *chazhao(float (*hang)[4], int n)
{
	float *q;           //int *q;
	q = (hang + n)[0];
	return(q);
} 

12.指针与一维二维数组的数值关系

&a[i]=a+i;
a[i]=*(a+i)

在这里插入图片描述

 *a[0]=*a                  *a  =*p     
*(c[1]+2)=*(*(c+1)+2)      *(*(c+1)+2) =*q  

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

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

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-02-05 21:32:58  更:2022-02-05 21:35:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:21:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码