★&与运算符: 取地址运算符 指针运算符(“间接访问”运算符) 含义:取变量的地址含义取指针所指向变量的内容 2000 整型变量i 1 pointer I pointer 2001 10 2002 &i_pointer 2000 10 2003 2004 ←一变量 i pointer 200 2000 指针变量 2006 pointer---指针变量,它的内容是地址量 1 pointer--指针的目标变量,它的内容是数据 & c1 pointer-指针变量占用内存的地址
Advanced Programming &与*运算符: 取地址运算符 含义: 取变量的地址 指针运算符(“间接访问”运算符) 含义: 取指针所指向变量的内容 …... …... 2000 2004 2006 2005 整型变量i 10 变量i_pointer 2001 2002 2003 2000 指针变量 i_pointer-----指针变量,它的内容是地址量 *i_pointer----指针的目标变量,它的内容是数据 &i_pointer---指针变量占用内存的地址 2000 10 i_pointer *i_pointer &i_pointer i
◆指针变量的初始化 一般形式:存储类型]数据类型指针名-初始地址值 int i. 赋给指针变量 int“p=&i: 不是赋给目标变量 例i 指针变量赋值 例int“t&*p=&i; int i,j; int i; int *g-p, nt *pl, * p2 1=&i;p2=& 用已初始3pl= j=6;*p2=8; Advanced programming
Advanced Programming ◆指针变量的初始化 一般形式:[存储类型] 数据类型 *指针名=初始地址值; 赋给指针变量, 不是赋给目标变量 例 int i; int *p=&i; 变量必须已说明过 类型应一致 例 int *p=&i; int i; 例 int i; int *p=&i; int *q=p; 用已初始化指针变量作初值 指针变量赋值: int i, j; int *p1, *p2; p1=&i; p2=&j ; i=3; *p1=5; j=6; *p2=8;
◆指针变量的引用 例81通过指针变量访问整型变量 #include <stdio.h> 运行结果: a=100,b=10 void main() pl=100,*p2=10 inta,b,“pl,*p2; &affd &b=ffd a=100;b=10: pI=ffd4, p2=ffd pl=&a; p2=&b: &pl=ffds, &p2=ffda printf(“a=%d,b=%dn”,;a,b) printf(* pl=%d, *p2=d\n", *pl, *p2); ffd r 100a printf(“&a=%x,&b=%X\n”’,&a,&b); ffd 10b printf(“pl=%X,p2=%X\n”,pl,p2); ffds ffd pl printf("&p1=%x,&p2=%xIn", &pl,& p2); ffda ffd p2 Advanced programming
Advanced Programming ◆指针变量的引用 例8.1 通过指针变量访问整型变量 #include <stdio.h> void main( ) {int a, b, *p1, *p2 ; a=100; b=10; p1=&a; p2=&b; printf(“a=%d, b=%d\ n”,a, b); printf(“* p1=%d, * p2=%d\ n”, *p1, * p2); printf(“&a=%x,& b=%x\ n”,&a, &b); printf(“p1=%x, p2=%x\ n”, p1, p2); printf(“& p1=%x, &p2=%x\ n”, &p1, & p2); } 运行结果: a=100, b=10 *p1=100, *p2=10 &a=ffd4, &b=ffd6 p1=ffd4, p2=ffd6 &p1=ffd8, &p2=ffda 100 10 ffd4 ffd6 a b p1 p2 ffd4 ffd6 ffd8 ffda
关于&和*运算符的进一步说明: 、&:优先级同为2级,结合性:从右向左。 1若已执行:inta,b,*p1,*p2: pl=&a;p2=&b;a=100;b=10; 则①&*p14>&a(p1) &*p24>&b(p2) ②p2=&pl>p2=&a 2.&am先进行&a得的地址,再对的地址进行*运算 3记单冷+:忧完级为2,结合怪从右到在1001 (p12→>a++b 2 p十一什0 &a 10 意即 pl原指向,现在指向下一个地址了 Advanced programming
Advanced Programming 关于 & 和 * 运算符的进一步说明: * 、&:优先级同为2级, 结合性:从右向左。 1.若已执行: int a, b, * p1, * p2; p1=&a; p2=&b; a=100; b=10; 则 ① &* p1 &a (p1) &* p2 &b (p2) ②p2=&* p1 p2=&a &a &b p1 p2 10 100 b a &a &a p2 p1 10 100 b a 2. * & a:先进行&a得a的地址,再对a的地址进行* 运算 即指向a地址所指向的变量,就是a ,其值是100 3. 运算符 * ,++ :优先级为2, 结合性:从右到左 (* p1)++ → a++ * p1++ → * (p1++) 意即: p1原指向a , 现在指向下一个地址了
例8.2输入a和b两个整数,用指针方法按先大后小顺序输出 #include <stdio.h> void main Rint *pl, "p2, *p, a, b scanf(%d%d”,&a,&b) 1=ca;p2=&b: if(a<b) kp=pl; pl=p2; p2 运行情况: printf("lna=%d, b=%dn", a, b); 5,9 printf(max=%d, min=%d\n",pl,*p 2);a-5, b-9 max=9. minEs 换前换后 ffdo ffd ffd p ffd2 ffds ffd p2 fd420 fidp 只交换了指针的值, ffd65 没有交换变量的值 5 a ffd 9 Advanced programming
Advanced Programming 例8.2 输入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(“\na=%d, b=%d\n”, a, b); printf(“max=%d, min=%d\ n”, *p1, *p2); } 运行情况: 5,9 a=5, b=9 max=9,min=5 只交换了指针的值, 没有交换变量的值 换前 换后 ffd8 ffd6 5 5 ffd0 ffd2 ffd4 ffd8 ffd6 ffd6 ffd8 20 ffd6 9 9 p1 p2 p a b