写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友。
目录
指针
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
以上是自己通过学习整理所得,大家有相关问题,可以留言,一起交流学习!
转载或者引用本文内容请注明来源及原作者