C语言 指针 指针变量的引用拓展及源码分析(三)

三.指针变量的引用拓展

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;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谦虚斯帕克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值