1 / 22

变量的地址及指针的概念

第七章 指针. 变量的地址及指针的概念. 指向简单变量的指针变量. 指向一维数组的指针变量. 变量的地址及指针的概念. 变量的地址. 变量代表了内存中的存储单元. 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.

galia
Download Presentation

变量的地址及指针的概念

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第七章 指针 • 变量的地址及指针的概念 • 指向简单变量的指针变量 • 指向一维数组的指针变量

  2. 变量的地址及指针的概念 • 变量的地址 • 变量代表了内存中的存储单元 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 ……}

  3. 变量的地址及指针的概念 • 变量的地址 • 变量代表了内存中的存储单元 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 ……}

  4. 变量的地址及指针的概念 • 访问变量的方式 如何定义指针变量 如何使一个指针变量指向另一个变量 如何使用指针变量间接访问变量 • 直接访问 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

  5. 指向简单变量的指针变量 • 指针变量的定义 • 通过指针变量 • 间接引用变量 类型名 *指针变量名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; …… }

  6. 程序举例 例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

  7. 程序举例 例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; }

  8. 程序举例 例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; }

  9. 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

  10. 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

  11. 指向一维数组的指针变量 例:对数组进行输入输出。 • 指向数组元素的指针变量 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

  12. 指向一维数组的指针变量 • 访问数组元素的方式 • 指针 • 下标法 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

  13. 指针变量的运算 以整型数组为例: 指向下一个数组元素。 指针变量加一 指向上一个数组元素。 指针变量减一 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

  14. 指针变量的运算 以整型数组为例: 两个指针变量相减 表示两个指针之间相隔的元素的个数。 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

  15. 程 序 举 例 例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

  16. 程 序 举 例 例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

  17. 程 序 举 例 例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

  18. 程 序 举 例 例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++) 87654321 printf("%3d", *p); }

  19. 程 序 举 例 例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

  20. 程 序 举 例 例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

  21. 指向一维数组的指针变量 • 指向数组的指针变量作函数参数 • 形参是指针变量,实参是指针变量。 • 形参是指针变量,实参是数组名。 • 形参是数组名,实参是数组名。 • 形参是数组名,实参是指针变量。

  22. 形参是指针变量实参是数组名举例 例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; }

More Related