三.指针变量的引用拓展
1.写法时注意的问题及说明
- 上一篇简单介绍 *取值运算符和 &取址运算符的定义,还有简单了解;
- 这一篇相当于上一篇的拓展;
简单语句区别
先看下面四种简单语句:
*p+=1;//(1)
++*p;//(2)
(*p)++;//(3)
*p++;//(4)
-
分析一下就知道前三种语句相同,都是将*p指向的值加一;
-
第四种写法是先取出*p所对应的值,然后对指针变量p进行加一的运算;
-
如果q也是指向字符型的指针变量,则语句为:
q=p;
那么q和p的值指向的都是同一个变量的地址;(不是值 !是地址 !); -
(3)和(4)式子的区别:
(*p)相当于p++; 括号很重要,如果去掉括号则意义完全不同 !
++ 和两个运算符为同一优先级别,结合方向为自右向左;如果去掉括号则变成
*(pointer_1++);
中等语句区别
&*pointer_1 = &a;//(1)
- &*pointer_1 含义?
’ * '和 ‘&’ 的优先级相同,并且结合性为自右向左;
则左侧的含义为指针变量所指向变量的地址;
-
&a的含义?
变量a的地址; -
最终结果是&*pointer_1指向的地址和变量a的地址相同;
&*pointer_1 = &a;
pointer_2 = &*pointer_1;//(2)
-
式子2的含义?
原本&*pointer_1指向a的地址,现在赋值给pointer_2;
则结果为pointer_2现在也指向变量a; -
相当于:
pointer_2 = &a;
2.源码分析
简单例题
- 题目:输出a和b两个整数,按从小到大的顺序输出a和b
这道题比较简单,有逻辑就可以写出来,下面是我自己写的
#include <stdio.h>
int main()
{
int ab,t,j;
scanf("%d,%d",a,b);
int *pointer_1,*pointer_2;
pointer_1 = &a;
pointer_2 = &b;
if (*pointer_1 > *pointer_2)
{
t = *pointer_1;
j = *pointer_2;
}else
{
t=*pointer_2;
j=*pointer_1;
}
printf("%d>%d",t,j);
return 0;
}
我写的有点复杂,也有其他答案
#include <stdio.h>
int 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;
}//别忘了结合性是从右到左,则p1指向b,p2指向a
printf("a = %d,b = %d\n",a,b);
printf("max = %d,min = %d",*p1,*p2);
return 0;
}