指针实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

可改为
#define N 10 main() { int a[N],i; printf("Input array a:\n"); for(i=0;i<N;i++) scanf("%d",a+i); sort(a,N); printf("Output the sorted array:\n"); for(i=0;i<N;i++) printf("%d ",*(a+i)); printf("\n"); } sort(int *p,int n) { int i,j,k,t; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) if(*(p+j)<*(p+k)) k=j; t=*(p+k); *(p+k)=*(p+i); *(p+i)=t; } }
a
a[0][0] a[0][1] a[0][2] a[0][3] 1 2 3 4
2008 2010
a[0][2]
a[0][3] a[1][0] a[1][1] a[1][2] 2016 2018 a[1][3] a[2][0] a[2][1] a[2][2]
2008
a+1
2016
a[1]
a[1][0] a[1][1] a[1][2] a[1][3] 5 6 7 8
–每个元素 的类型都是 整型指针
●可让p指向二维数组某一行
如 int a[3][4], (*p)[4]=a
一维数组指针变量维数和二维数组列数必须相同
a
int a[3][4]; a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2]
p p[0]+1或 *p+1 *(*p+1)或 (*p)[1]
a+2
a[2]
a[2][0] a[2][1] a[2][2] a[2][3] 9 10 11 12
a[2][3]
– 再回顾:
– int i; – int a[10];
• a是一个数组,它有10个元素,
• 每个元素的类型都是整型。 int *p; int *pa[10];
–pa是一个数组,它有10个元素,
1 4 7 10
2 5 8 11
例10-15 实验8指针 思考题第1题
编写一个函数实现 将一个3×3的矩阵 转置。 分析说明:在 主函数中用 scanf 输入矩阵元素,将 数组名作为函数参 数,在执行函数的 过程中实现矩阵转 置,函数调用结束 后在主函数中输出 已转置的矩阵。
#include "stdio.h" void tranf(int (*p)[3]) { int t,i,j; for(i=0;i<3;i++) for(j=0;j<i;j++) { t=*(*(p+i)+j); *(*(p+i)+j)=*(*(p+j)+i); *(*(p+j)+i)=t; } } main() { int i,j,a[3][3]; for(i=0;i<3;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]); tranf(a); for(i=0;i<3;i++) { for(j=0;j<3;j++) printf("%3d",a[i][j]); printf("\n"); } }
1000 1002 1
p1 p2 p
#include "stdio.h" swap(int *p1,int *p2) { int p; p=*p1;*p1=*p2; *p2=p; }
main()没有错误
值传递,地址未变, 但存放的变量的值改变了
swap2(int *p1, int *p2) main( ) { int a=3, b=5; { int t; swap2(&a, &b); t = *p1; …… *p1 = *p2; } *p2 = t; } • 要使某个变量的值通过函数调用发生改变
• (1) 在主调函数中,把该变量的地址作为实参 • (2) 在被调函数中,用形参(指针)接受地址
• (3) 在被调函数中,改变形参(指针)所指向变量的 值
函数void fun(fioat *sn,int n)的功能是:根据以下 例10-7 公式计算s,计算结果通过形参指针sn传回;n通过形 (实验8指针_2) 参传入,n的值大于等于0。请填空。 1 1 1 1 s 1 3 5 7 2n 1 void fun(float *sn,int n) { float s=0.0,w,f=-1.0; int i=0; for (i=0;i<=n;i++); 去掉分号 { f= -1 * f; w=f/(2*i+1); s+=w; } *sn =s; } main() { float s; int n; printf("n="); scanf("%d",&n); fun(&s,n); printf("s=%f\n",s); }
例10-6-1(实验八指针_3)
想使指针变量pt1指向a和b中的大者,pt2ຫໍສະໝຸດ Baidu向小者,以下 程序能否实现此目的?
swap(int *p1,int *p2) { int *p; p=p1; p1=p2; p2=p; } main() { int a,b; int *pt1,*pt2; scanf("%d,%d",&a,&b); pt1=&a;pt2=&b; if(a<b) swap(pt1,pt2); printf("%d,%d\n",*pt1,*pt2); } 分析:假设输入 1,3 a 1 1000 3 b 1002 pt1 1000 pt2 1002
a[i][j]的内容:*(*(p+i)+j)等价于*(p[i]+j)
a[2][2]
#include<stdio.h> main() { int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12} 1, 2 int i,j; a[1][2]=7 scanf(“%d,%d”,&i,&j); printf(“a[%d][%d]=%d\n”,i,j,*(*(a+i)+j)); } #include<stdio.h> main() { int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12} int i,j, (*p)[4]; p=a; scanf(“%d,%d”,&i,&j); printf(“a[%d][%d]=%d\n”,i,j,*(*(p+i)+j)); }
a+1
p+1 p[1]+2或 *(p+1)+2 *(*(p+1)+2) p+2
a[1][3] a[i]+j a[i][j]的地址:*(a+i)+j等价于
a+2 a[2][0]
a[i][j]的内容:*(*(a+i)+j) 等价于*(a[i]+j) a[2][1]
a[i][j]的地址:*(p+i)+j等价于 a[2][3] p[i]+j
i 0 1 2 3
i<=n f w 真 1 1/1 真 -1 -1/3 1 1/5 真 -1 -1/7 真 …… ……
改变形参(指针) 所指向变量的值
例10-8(实验八指针_1)
#include "stdio.h" main() { int a[5],*p,j; for(j=0;j<5;j++) a[j]=j+1; p=a; for(j=0;j<5;j++) printf("*(p+%d)=%d\n",j,*(p+j)); } p[j]
例10-11 实验8指针 思考题第2题
用指针的方法 对n个整数排序 并输出。 要求将排序单 独写一个函数。 n 和各个整数 在主函数中输 入,最后在主 函数中输出。
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
2000 a[0]
2000 2002
a[0][0] a[0][1]
1002 1000 1000 1002 1000
p1 p2 p
值传递,形参指针的改变不会影响实参
例10-6-2(实验八指针_3)
swap(int *p1,int *p2) { int *p; p=p1; p1=p2; p2=p; } main() { int a,b; int *pt1,*pt2; scanf("%d,%d",&a,&b); pt1=&a;pt2=&b; if(a<b) swap(pt1,pt2); printf("%d,%d\n",*pt1,*pt2); printf("%d,%d\n",*pt1,*pt2); } 分析:假设输入 1,3 a 1 3 1000 3 1 b 1002 pt1 1000 pt2 1002
例10-12
若已定义
例10-13
。 3 6 9 12
int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12}; Int (*ptr)[3]=a,*p=a[0];
能正确表示数组元素a[1][2]的表达式是
A
B C D
*((*ptr+1)[2])
*(*(p+5)) *(ptr+1)+2 *(*(a+1)+2)
相关文档
最新文档