220 likes | 352 Views
第七章 指针. 变量的地址及指针的概念. 指向简单变量的指针变量. 指向一维数组的指针变量. 变量的地址及指针的概念. 变量的地址. 变量代表了内存中的存储单元. 2000. 12. 内存单元按字节编号. a. 12. 200 2. 变量类型不同,占据的字节数 不同. 200 4. 5. char :. int :. 1 字节. 4 字节. float :. 4 字节. b. 5. 变量所占内存单元首字节的 地址就是变量的地址. 200 6. 200 8. 2.4. void main( ). 2 .4. x.
E N D
第七章 指针 • 变量的地址及指针的概念 • 指向简单变量的指针变量 • 指向一维数组的指针变量
变量的地址及指针的概念 • 变量的地址 • 变量代表了内存中的存储单元 2000 12 • 内存单元按字节编号 a 12 2002 • 变量类型不同,占据的字节数 • 不同 2004 5 char: int: 1字节 4字节 float: 4字节 b 5 • 变量所占内存单元首字节的 • 地址就是变量的地址 2006 2008 2.4 void main( ) 2.4 x 2010 { int a,b; float x; char c; scanf("%d,%d", &a, &b); 17 c 2012 17 x=(float)a/b; 地址 … … c=a+b; 12,5 ……}
变量的地址及指针的概念 • 变量的地址 • 变量代表了内存中的存储单元 2000 12 • 内存单元按字节编号 a 12 2002 • 变量类型不同,占据的字节数 • 不同 2004 5 char: int: 1字节 4字节 float: 4字节 b 5 • 变量所占内存单元首字节的 • 地址就是变量的地址 2006 2008 2.4 void main( ) 2.4 x 2010 { int a,b; float x; char c; scanf("%d,%d", &a, &b); 17 c 2012 17 x=(float)a/b; 地址 … … c=a+b; 12,5 ……}
变量的地址及指针的概念 • 访问变量的方式 如何定义指针变量 如何使一个指针变量指向另一个变量 如何使用指针变量间接访问变量 • 直接访问 2000 12 直接按变量名存取变量值 a 12 • 间接访问 2002 变量地址存放在一个变量中,通过访问这个变量来存取变量的值 2004 5 b 5 2006 • 重要概念 • 指针 变量的地址 2008 2.4 2.4 存放指针的变量 x • 指针变量 2010 如: p是指针变量 17 c 2012 17 p中存放变量a的地址 3000 地址 … … p指向a p &a 2000
指向简单变量的指针变量 • 指针变量的定义 • 通过指针变量 • 间接引用变量 类型名 *指针变量名1, *指针变量名2, ...; * :间接访问运算符 • 类型名 (float、int、char等) *i_p: 指定指针变量可以指向的变量类型。 访问指针变量i_p所指向的变量 • * i 0 3 指针变量的标志 指针变量i_p指向变量i …… void main( ) 如: int *i_p, *j_p; { int i=0,*i_p; float *t; i_p &i • 给指针变量赋地址值 i_p=&i; *i_p=3; :取址运算符 & i=3; …… }
程序举例 例2: 写出程序的运行结果 110 例1: 以下程序段的输出结果是. …… …… int k=2, m=4, n=6; int *var, ab; int *pk=&k,*pm=&m,*p; ab=100; p=&n; var=&ab; *p=*pk*(*pm); ab=*var+10; cout<<n<<endl; …… cout<<*var<<endl; k m n …… *pk*(*pm) 2 4 6 8 =k*m var ab *p=8 100 110 &ab &k &m &n 8 pk pm p
程序举例 例3 填空。该程序的功能是输入两个整数,然后按从小到大的顺序输出。 #include <iostream.h> void main( ) { int a, b; int *maxp, *minp; cin>>a>>b; minp =a<b?&a:&b; a>b?&a:&b; maxp=e cout<<*minp<<*maxp; }
程序举例 例4:写出程序的运行结果。 a b w 值传递 #include <iostream.h> &x &y 4.0 void fun(float *a, float *b) { float w; *a=*a+*a; y x 2.0 3.0 3.0 4.0 4.0 w= *a; *a= *b; *b= w; } px py &x &y void main( ) { float x=2.0, y=3.0; 3, 4 float *px=&x, *py=&y; fun(px, py); 用指针作形参可以将子函数的处理结果传递回主函数 cout<<x<<','<<y<<endl; }
a x y t a b b t y x 程序举例 例5:写出程序的运行结果。 #include <iostream.h> #include <iostream.h> void swap(int x, int y) void swap(int *x, int *y) 形参及 内部变量 形参及 内部变量 { int t; { int t; 实参 t=*x; t=x; 5 5 &a 10 10 5 *x=*y; x=y; *y=t; } 10 10 &b 5 5 y=t; } 10 void main( ) void main( ) 5 5 { int a=5, b=10; { int a=5, b=10; cout<<a<<','<<b<<endl; cout<<a<<','<<b<<endl; swap(&a,&b); swap(a, b); cout<<a<<','<<b<<endl; } cout<<a<<','<<b<<endl; } 5,10 5,10 5,10 10,5
x y t y t x b b a a 程序举例 例5:写出程序的运行结果。 #include <iostream.h> #include <iostream.h> void swap(int *x, int *y) void swap(int *x, int *y) 形参及 内部变量 形参及 内部变量 { int *t; { int t; t=x; t=*x; 5 &a 5 &a 10 &b x=y; *x=*y; y=t; } *y=t; } 10 &b 10 &b 5 &a void main( ) void main( ) &a 5 { int a=5, b=10; { int a=5, b=10; cout<<a<<','<<b<<endl; cout<<a<<','<<b<<endl; swap(&a,&b); swap(&a,&b); cout<<a<<','<<b<<endl; } cout<<a<<','<<b<<endl; } 5,10 5,10 10,5 5,10
指向一维数组的指针变量 例:对数组进行输入输出。 • 指向数组元素的指针变量 void main() • 指针变量的定义 { int a[5], i, *pa; • 数组首地址赋给指针变量 pa=&a[0]; a • 指针变量指向数组元素 for(i=0; i<5; i++) scanf("%d", pa+i); 若pa指向a[0], for(i=0; i<5; i++) 则pa+i指向a[i]。 printf("%d ", *(pa+i); } • 通过指针访问数组元素 &a[0] pa a[0] a[1] 由于pa+i指向a[i], pa+1 a[2] …… 则 *(pa+i)间接访问a[i]。 a[3] a[4] pa+4
指向一维数组的指针变量 • 访问数组元素的方式 • 指针 • 下标法 p[i] (直接访问) a[i] 若p指向a[0] 则 *(p+i)表示间接访问a[i] • 数组名 若p指向a[i] 则 *p表示间接访问a[i] *(a+i) a[i] &a[0] p a[0] a a[0] a[1] a[1] p+1 a+1 a[2] a[2] …… …… a[3] a[3] a[4] a[4] p+4 a+4
指针变量的运算 以整型数组为例: 指向下一个数组元素。 指针变量加一 指向上一个数组元素。 指针变量减一 a[0] 2000 void main( ) pa+n的地址: pa+n*d d与类型有关: 2004 a[1] { int a[5], *pa=a; pa pa++; 2008 a[2] 2016 2004 2008 2000 pa+=3; int: 4 pa-=2; float: 4 a[3] 2012 …… } char: 1 a[4] 2016
指针变量的运算 以整型数组为例: 两个指针变量相减 表示两个指针之间相隔的元素的个数。 a[0] 2000 p1 p1=&a[1]; p2=&a[4]; 2004 a[1] &a[1] 3 p2-p1的值是 2008 a[2] 两个指针变量可以进行关系运算 a[3] 2012 p1=&a[1]; p2=&a[4]; p2 p1<p2的值是 1 a[4] 2016 &a[4] p1==p2的值是 0
程 序 举 例 例6:写结果。 pa #include <stdio.h> void main() { char a[ ]="Stu-Dent", *pa; for(pa=a; *pa!='\0'; pa++) if(*pa>='A'&&*pa<='Z') *pa=*pa+32; else if(*pa>='a'&&*pa<='z') *pa=*pa-32; puts(a); } a[0] S &a[0] s &a[7] &a[5] &a[6] &a[1] &a[8] &a[3] &a[2] &a[4] a[1] t T a[2] u U a[3] - a[4] D d a[5] e E a[6] n N a[7] t T a[8] \0 sTU-dENT
程 序 举 例 例7:写结果。 s #include <iostream.h> void main() { char b[4]="ABC", *s; s=b; do { cout<<*s%10; s++; } while(*s!=0); } &b[0] b[0] &b[2] &b[3] A &b[1] b[1] B b[2] C b[3] \0 5 6 7
程 序 举 例 例8:写结果。 s #include <stdio.h> void main() { char b[4]="ABC", *s; s=b; do { puts(s); s++; } while(*s!=0); } &b[0] b[0] &b[2] &b[3] A &b[1] b[1] B b[2] C b[3] \0 ABC BC C
程 序 举 例 例9:输入1 2 3 4 5 6 7 8,写出以下程序的运行结果。 p #include <stdio.h> #define M 8 a[0] 1 &a[0] 8 void main( ) p+1 a[1] 2 7 { int a[M], i, j, t, *p=a; p+2 a[2] 3 6 for(i=0; i<M; i++) i j p+3 a[3] 4 5 scanf("%d", a+i); 0 7 p+4 a[4] 5 4 i=0; j=M-1; 1 6 p+5 a[5] 6 while (i<j) 3 2 5 { t=p[i]; p[i]=[j]; p+6 a[6] 7 3 4 2 4 3 p[j]=t; i++; j--; } a[7] p+7 8 1 for(i=0; i<M; i++, p++) 87654321 printf("%3d", *p); }
程 序 举 例 例11:写结果 #include <stdio.h> a -5 b -12 c -7 void sub(int x, int y, int *z) { *z=y-x; } y 5 z void main( ) x 10 &a { int a, b, c; y -5 z sub(10, 5, &a); x 7 &b sub(7, a, &b); y -12 z sub(a, b, &c); x -5 &c printf("%d,%d,%d\n",a, b, c); } -5,-12,-7
程 序 举 例 例12:写结果 #include <stdio.h> void main() { int a[ ]={1,2,3,4,5,6,7,8,9,10}; int *p; p=a; printf("%d\n", *p+9); } #include <stdio.h> void main() { int arr[ ]={3,2,5,6,7,4}; int *p=arr; p++; printf("%d\n", *(p+3)); } 10 7
指向一维数组的指针变量 • 指向数组的指针变量作函数参数 • 形参是指针变量,实参是指针变量。 • 形参是指针变量,实参是数组名。 • 形参是数组名,实参是数组名。 • 形参是数组名,实参是指针变量。
形参是指针变量实参是数组名举例 例10:读程序,写结果。 p #include <iostream.h> a[0] void main( ) 0 &a[0] { int a[5], i, t; a[1] 1 p+1 int sub(int *, int ); a[2] 4 p+2 for(i=0; i<5; i++) a[3] 9 p+3 a[i]=i*i; a[4] 16 p+4 t = sub(a,5) ; cout<<t<<endl; } int sub(int *p, int n) 30 { int i, s=0; for(i=0; i<n; i++) s+=*(p+i); return s; }