写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友。
目录指针
1.指针变量与普通变量2.指针变量与一维数组3.指针变量与一维数组相关函数4.指针变量与二维数组5.指针变量与二维数组相关函数
指针 1.指针变量与普通变量
指针=&变量 *指针=指针指定的变量的值
实现p、q的值互换
例1
//不改变a,b的值,通过指针实现功能 #includeint 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输出 #include2.指针变量与一维数组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; }
指针=&数组名[某数] *指针=指针指定的变量的值 指针+i=&数组名[某数+i]
*p=*p*2; *(q+1)=*p*2;
例2
//常规思路 #includeint 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; }
//用指针来实现这个程序 #includeint 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
#includeint 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); }
//形参变成指针变量,实参变成指针变量 #include4.指针变量与二维数组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); }
指针=&数组名[数a][数b] *指针=指针指定的变量的值 指针+i=&(数组名[数a][数b]后面第i个元素)
*p=*p*2; *(q+1)=*q*2;
练习
#includeint 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]+α*列数+β
数组名[数α][数β] 相当于 *(数组名[数α]+[数β])
#include5.指针变量与二维数组相关函数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; }
<1>
形参是数组名,实参是数组名。
转换为↓
形参是指针变量,实参是数组名。
函数声明:数组名[][某数]→*p 函数解释:数组名[i][j]→*(p+i*列数+j) 函数使用:数组名→*数组名
形参是数组名,实参是数组名。
#includeint 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); }
形参是指针变量,实参是数组名。
#includeint 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(使用前要先关联)
#includeint 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); }
修改后的程序:
#includeint 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课



