若有intx=1,*px=&x;声明,则对于 y=pX + y=(px)++; 这两条语句的执行效果是不同的 前者等价于执行:y=x;px+;,而后者则等 价于执行y=x;x++;。因(px)就是x 注意:语句y=*(*px)++;是错误的。这是典型 的非法间接访问操作
26 若有 int x=1 , *px=&x; 声明,则对于: y = *px++ ; y = (*px)++ ; 这两条语句的执行效果是不同的: 前者等价于执行:y=x ; px++ ; ,而后者则等 价于执行 y=x; x++; 。因(*px)就是x 注意:语句 y=*(*px)++; 是错误的。这是典型 的非法间接访问操作
例1:几种间接引用运算的效果:rpcC10a main FFDE FFDCI b int a=1. *b=&a rinf(“%dm”,*b);/相当于输出a printf(“%pⅦm”,b);/输出a的地址* printf(“%pⅦn”,&*b);/输出a的地址*/ printf(“%dⅦn”,*&a);/*相当于输出a*/ &*b=10;/相当于执行a=10;* printf(“%dm”,a);/输出a* 程序输出: FFDC FFDC 10 27
27 main ( ) { int a=1 ,*b=&a ; printf ( “%d\n” , *b ) ; printf ( “%p\n” , b ) ; printf ( “%p\n” , &*b ) ; printf ( “%d\n” , *&a ) ; *&*b=10 ; printf ( “ %d\n ” , a ) ; } /* 相当于输出a */ /* 输出a 的地址 */ /* 输出a的地址 */ /* 相当于输出 a */ /* 相当于执行 a=10; */ /* 输出a */ 程序输出: 1 FFDC FFDC 1 10 例1:几种间接引用运算的效果: FFDC 1 a FFDE FFDC b 10
例2:指针变量作函数参数 在第八章中曾举过一个函数间传递变量的例子 void swap(int x, int y) main( Int z i int a=l. b=2 ZEX swap(a, b); x-y 2 printf(“a=%d,b=%d”,a,b); 程序输出:a=1,b=2 swap的功能是交换两个变量的值。实际上交换的 只是swap函数中两个局部变量x和y的值,并不反映到 main函数中,因此main函数中变量a和b的值不变。 28
28 main ( ) { int a=1 , b=2; swap (a , b) ; printf (“a=%d,b=%d”,a,b); } void swap(int x,int y) { int z ; z=x ; x=y ; y=z ; } swap的功能是交换两个变量的值。实际上交换的 只是swap函数中两个局部变量x和y的值 , 并不反映到 main函数中, 因此main函数中变量a和b的值不变。 例2:指针变量作函数参数 在第八章中曾举过一个函数间传递变量的例子: 程序输出:a=1 , b=2
要通过调用swap函数,使得main函数中变量和b 的值被交换,必须在两个函数间传递变量a和b的地址。 例如: void swap(int *x,int *y) main O int a=l. b=2: int z swap( &a, &b ) Zx, printf(a=%od, b=%d, a, b); z 程序输出:a=2,b=1
29 void swap(int *x,int *y) { int z ; z=*x ; *x=*y ; *y=z ; } main ( ) { int a=1 , b=2; swap( &a , &b ); printf(“a=%d,b=%d”,a,b); } 程序输出:a=2 , b=1 要通过调用swap函数,使得main函数中变量a和b 的值被交换, 必须在两个函数间传递变量a和b的地址。 例如:
例3使用指针变量进行输入输出 假定有声明: int x, p=&x 则调用 scanf函数输入x,通常这样进行: scanf(“%d”,&x); 因为现在指针变量p已经存储了变量x的地址(已 指向了x),所以输入x也可按如下方法进行 scanf(“%d”,p);/不能写成&p* 同理,要输出x的值,下面的两种方式是等价的 printf(“%d”,p); 等价 printf(“%d”,x);
30 例3 使用指针变量进行输入/输出 假定有声明: int x ,*p=&x ; 则调用scanf 函数输入 x , 通常这样进行: scanf ( “%d”, &x ) ; 因为现在指针变量 p 已经存储了变量x的地址(已 指向了x) ,所以输入x也可按如下方法进行: scanf ( “%d” , p ) ; /* 不能写成 &p */ 同理,要输出 x 的值,下面的两种方式是等价的: 等价 printf ( “%d” , *p ) ; printf ( “%d” , x ) ;