2012 1010 1010 int a,p 让p指向a p=&a a scanf(“%d”,p printf c%dn”,p);等价于&a p 12 printf(“%dm”,),对a重新赋值 等价于a=12 与央 p=&a &p&(p)+&a*&a+*(&a)+卹p+a 由于&和*运算符优先级相等,所以按照从右到左的顺 序进行结合运算
int a , *p ; p = &a ; scanf ( “%d” , p ) ; printf (“%d\n” , *p ) ; *p = 12 ; printf (“%d\n” , *p ) ; p a 2012 1010 1010 125 让p指向a 对a 重新赋值 等价于 a=12 等价于&a 2. & 与* p = &a ; &*p → &(*p) → &a *&a → *(&a) → *p → a 由于&和*运算符优先级相等,所以按照从右到左的顺 序进行结合运算
3.*与++, 2012 1010 int a=2, b=5,c, d, * p 1014 3 (1)p=&a; (p)+;(等价于a++;) 5|b p的值为a的地址,*p的值为2 3c 语句执行之后p的值不变,*p的值为3 3 (2)c=*p++; 等价于c=*p;p++; 关于p++的说明:由于*和++ 运算符的优先级一样,遵从从 执行后c的值为3,p的值为5右到左的顺序,所以等价于 (p++)。由于++在p的后面, (3)d=*++p; 则先操作后加一,所以写成 p;p++; 等价于++p;d=p; 由于p的数据类型为int所以 执行后d的值为3,如p的值为3p+等价于pp+2。参看课本 P212第二自然段的说明
2 a b c d 5 3. *与 ++ , - - int a = 2 , b = 5 , c , d , *p ; p 的值为a 的地址, *p 的值为2 语句执行之后p 的值不变, *p 的值为 3 (2) c = *p++ ; 等价于 c = *p ; p++ ; 执行后 c 的值为 3 , *p 的值为 5 (3) d = *++p ; 等价于 ++p ; d = *p ; 执行后 d 的值为 3 , *p 的值为 3 p 2012 1010 1010 (1) p = &a ; (*p)++ ; ( 等价于 a++ ; ) 1012 3 3 1014 3 关于*p++的说明:由于*和++ 运算符的优先级一样,遵从从 右到左的顺序,所以等价于 *(p++)。由于++在p的后面, 则先操作后加一,所以写成 c = *p ; p++ ; 由于p 的数据类型为int所以 p++等价于p=p+2。参看课本 P212 第二自然段的说明
例10.2输入a和b两个整数,按先大后小的顺 序输出a和b。 pl&b 5|a include <stdio.h> void main( i int *pI, p2, *p, a, b 2&a scanf( %d%d", &a, &b); pl=&a: p2=&b; p&a if(a<b) ip=pI 输出结果 pI=p2; a=5,b=9 2 max=9, min=5 printf(“a=%d,b=%dmn”,a,b) printf(max=%d, min=%d n", pl, p2); 本程序的目的是:实现在指针变量p1中存放值较大的 变量的地址;p2中存放值较小的变量的地址
例10. 2输入a和b两个整数,按先大后小的顺 序输出a和b。 #include <stdio.h> void main( ) { int *p1 , *p2 , *p , a , b ; scanf(“%d%d”, &a , &b); p1 = &a ; p2 = &b ; if (a<b) { p = p1 ; p1 = p2 ; p2 = p ; } printf(“a=%d, b=%d \n”, a , b); printf(“max=%d, min=%d \n”,*p1 ,*p2) ; } a b p1 p2 p &a &b &b &a &a 5 9 输出结果: a=5 , b=9 max=9 , min=5 本程序的目的是:实现在指针变量p1中存放值较大的 变量的地址;p2中存放值较小的变量的地址
三、指针变量作函数参数 main 例:2个数按大小顺序输出 (整型变量做参数) a 5 #include <stdio.h> void swap( int x, int y 9 int temp; emp=x, y= temp; void main( 说明:该程序不能实现a和b f int a, bi 的交换因为实参a,b对形参 scanf(%d %d', &a, &b) if(a<b) swap(a, b); y是“值传递”,x和y的 化不影响a和b →rint(“a=%d,b=%dlmn”,a,b); 所以输出为:a=5,b=9
三、 指针变量作函数参数 例: 2个数按大小顺序输出 (整型变量做参数) #include <stdio.h> void swap( int x , int y) { int temp; temp = x ; x = y; y = temp; } void main( ) { int a , b ; scanf(“%d%d”,&a, &b); if (a<b) swap(a , b); printf(“a=%d, b=%d\n”, a, b); } a b x y 5 temp 说明: 该程序不能实现a 和b 的交换因为实参a , b 对形参 x , y 是“值传递”, x 和y 的 变 化不影响a 和b 所以输出为: a=5, b=9 9 main swap 5 5 9 9 5
例10.3① main (指针变量做参数) #include <stdio.h> ptl &a void swap(int *pl, int *p2) f int temp; a 9 temp=*pl; pI=*p2; p2=temp;交换的是指针变P&b 量指向的变量的值* void main( b5 int a,b,*ptl, * pt2 说明:这种方法是交换p1和 scan fe90d%0d7,&a,&b);p2所指向的变量的值.,即 ptl=&a; pt2=&b: 交换main函数中a和b的值 if (a<b) swap(ptl, pt2); 所以输出为:a=9,b=5 printf(“a=%d,b=%dⅦn”,a,b)
例 10. 3 ① (指针变量做参数) #include <stdio.h> void swap1(int *p1 , int *p2) { int temp; temp = *p1 ; *p1 = *p2; *p2 = temp;/*交换的是指针变 量指向的变量的值*/ } void main( ) { int a , b , *pt1 , *pt2 ; scanf(“%d%d”,&a , &b); pt1 = &a ; pt2 = &b ; if (a<b) swap1( pt1 , pt2) ; printf(“a=%d, b=%d\n”, a, b); } a b p1 p2 temp &b pt1 &a pt2 5 说明: 这种方法是交换p1和 p2所指向的变量的值, 即 交换main函数中a 和b的值 所以输出为: a=9, b=5 main swap1 5 9 &a &b 9 5