例8.1 main( fint a, b; int *p1, *p2, a=100;b=10; p1=&a;p2=&b;将变量a和b的地址赋给指针变量p1和p2 printf("%d, %dn",a, b); printf(9%d,%dn”4p1,*p2);1和*2就是变量a和b 运行结果: 100.10 100,10
例8.1 main( ) {int a,b; int *p1, *p2; a=100; b=10; p1=&a; p2=&b; printf(“%d,%d\n”,a, b); printf(“%d,%d\n”, *p1, *p2); } 将变量a和b的地址赋给指针变量p1和p2 *p1和*p2就是变量a和b 运行结果: 100, 10 100, 10
说明 ①若先执行p=&a;再执行8p;是什么意思?这里 “&”和“*”的优先级相同,但按“自右至左”结合, &*p1与&a相同 而p2=&*p1;的作用是将&a赋给p2。 ②若先执行p1&a;则*&a和*p1的作用相同。即 *&a与a是等价的 ③(p1)++等价于a++。 &*p1 p 注意:括号是必须的,否则就成为 口□a *(p1++)。这时先按p1的原值进行 *&a 2 *运算得到a的值。然后使p1的值 改变,则p1不再指向a了
说明: 若先执行p1=&a; 再执行&*p1; 是什么意思? 这里 “&”和“*”的优先级相同,但按“自右至左”结合, 即 &*p1与&a相同。 p1 a &*p1 而p2=&*p1; 的作用是将&a赋给p2。 p2 若先执行p1=&a; 则 *&a和*p1的作用相同。即: *&a与a是等价的 (*p1)++ 等价于a++。 *p1 *&a 括号是必须的,否则就成为 *(p1++)。这时先按p1 的原值进行 * 运算得到 a 的值。然后使p1的值 改变,则p1不再指向 a 了。 注意:
例82 main( [int *p1, *p2, * p, a, b; scanf("/dd, &a, &b) p1=&a;p2=&b; if (asb)ip=pl; p1=p2; p2=p; 1 printf((a=%d,b=%dⅦn”,a,b) printf("max=%d, min=%dn", *p1, *p2); 运行情况: p1 a 59 &a 5 p a=5,b=9 max, min=5 p2 b 注意:此例中a和b并未交 &b 9 换,而p1和p2的值改变
例8.2 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 &a &b 5 9 p 运行情况: 5 9 注意:此例中a和b并未交 换,而p1和p2的值改变。 a=5, b=9 max=9, min=5
8.5指针与数组 1.指向数组元素的指针变量的定义与赋值 例:inta[10],p p=&ao;将a[]元素的地址赋给指针变量p 在c中,数组名代表数组的首地址。因此p=a;与p=&a[0];是等价的。 注:p=a;是将a数组的首地址赋给指针变量p。但这里的a并不 代表整个数组 2.通过指针引用数组元素 ①若p=a;是将整型数组a的首地址赋给整型指针变量p,则*p=5; 是将整数5赋给a数组的第一个元素a[o],等价于a[0]=5。 ②p+1表示指针变量p当前所指的数组元素的下一个元素。但p+1 不是p的值加1。若有p=&a[];则p+i(或a+)就是a[订的地址 (因为a代表数组a的首地址)。 ③若有p=&ao];则p+)或a+就是p+或a+所指向的数组元素, 即a[i]。也就是说*p+i)=*(a+)=a[]。 ④指向数组的指针变量可以带下标,如:p与*p+是等价的
8.5 指针与数组 1. 指向数组元素的指针变量的定义与赋值 例: int a[10],*p; p=&a[0]; 将a[0]元素的地址赋给指针变量p 在C中,数组名代表数组的首地址。因此p=a;与p=&a[0];是等价的。 注:p=a; 是将a数组的首地址赋给指针变量p。但这里的a并不 代表整个数组。 2. 通过指针引用数组元素 若p=a; 是将整型数组a的首地址赋给整型指针变量p,则*p=5; 是将整数5赋给a数组的第一个元素a[0],等价于a[0]=5 。 p+1表示指针变量p当前所指的数组元素的下一个元素。但p+1 不是p的值加1。若有 p=&a[0]; 则p+i(或a+i) 就是a[i]的地址 (因为a代表数组a的首地址)。 若有p=&a[0]; 则*(p+i)或*(a+i)就是p+i或a+i所指向的数组元素, 即a[i]。也就是说 *(p+i) = *(a+i) = a[i]。 指向数组的指针变量可以带下标,如:p[i] 与*( p+i)是等价的
例8.3输出有10个元素的整型数组a的元素值。 main( I int a[101, *p, i for(=0; i<10; i++) scanf(%d', &aD); printf( n): for (p=a; p<(a+10);p++) printf(%d,*p) 也可写成如下: maino int a[101, *p=a, i; for(i=0; i<10; i++)scanf(%d,p++) printf("n) p=a, 此语句必不同少 for(i=0; i<10; i++, p++) printf("%d",p);
例8.3 输出有10个元素的整型数组 a 的元素值。 main( ) { int a[10], *p, i; for (i=0; i<10; i++) scanf(“%d”,&a[i]); printf(“\n”); for (p=a; p<(a+10); p++) printf(“%d”,*p); } 也可写成如下: main( ) { int a[10], *p=a, i; for (i=0; i<10; i++) scanf(“%d”,p++); printf(“\n”); p=a; for (i=0; i<10; i++, p++) printf(“%d”,*p); } 此语句必不可少