写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友。
指针
1.指针变量与普通变量
指针=&变量
*指针=指针指定的变量的值
实现p、q的值互换 例1
#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;
}
#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];
printf("请输入5个整数:\n");
for (i = 0; i <= 4; i++)
{
scanf_s("%d", p+i);
*(p+i) = *(p + i) * 2;
}
printf("加倍后的各整数为:\n");
for (i = 0; i <= 4; i++)
printf("%d\t", *(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);
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));
printf("第2组的平均分是%f\n", aver(zu2, 10));
return 0;
}
float aver(float a[], int n)
{
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);
float zu1[5],zu2[10];
int i,*q,*r;
q=&zu1[0];r=&zu2[0];
printf("请输入第1组的学生成绩:\n");
for (i = 0; i <= 4; i++)
scanf_s("%f", q+i);
printf("请输入第2组的学生成绩:\n");
for (i = 0; i <= 9; i++)
scanf_s("%f", r+i);
printf("第1组的平均分是%f\n", aver(q,5));
printf("第2组的平均分是%f\n", aver(r, 10));
zu2=r
return 0;
}
float aver(float *p, int n)
{
float sum = *p, pingjunshu;
int i;
for (i = 1; i < n; i++)
sum = sum + *(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++)
{
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);
float fenshu[3][4] = { 65,67,70,60,80,87,90,81,90,99,93,98 };
shuchu(*fenshu, 12);
return 0;
}
void shuchu(float *p, int n)
{
float sum = 0;
int i;
for (i = 0; i <= 11; i++)
sum = sum = *(p + i);
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);
float fenshu[3][4] = { 65,67,70,60,80,87,90,81,90,99,93,98 };
int *q; q = &fenshu[0][0];
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);
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];
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;
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);
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)
{
int i;
printf("第%d个学生的各科成绩是:\n", n);
for (i = 0; i <= 3; i++)
printf("%f\t", *(*(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);
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)
{
int i;
for (i = 0; *(yuanlaidep+i)!= '\0'; 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);
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);
for (i = 0; *(xindeq+i) != '\0'; i++)
printf("%c", *(xindeq+i));
printf("\n");
return 0;
}
void fuzhi(char *yuanlaidep, char *xindep)
{
int i;
for (i = 0; *(yuanlaidep+i)!= '\0'; 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));
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));
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;
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课
|