zoukankan      html  css  js  c++  java
  • 理解*ptr++

    这是C语言中指针的基本用法之一,我们先来看一个小例子。下面是代码:

    int main(void)
    {
        char *p = "Hello";
        while(*p++)
            printf("%c", *p);
        return 0;
    }

    这段代码中第一句表达式:

    char *p = "Hello";

    声明了指向char类型的指针p,当我们说“指向char类型的指针”时到底是什么意思呢?实际上很简单:p的值就是一个存放char类型元素的地址,p告诉我们在内存中有这么一块地址里面存放的是char类型的变量。

    这句表达式初始化了指针p,将它指向字符串“Hello”的第一个字符,对于这一点我们要时刻记住p指向的并不是整个字符串,而只是第一个字符“H”,也就是说p的值是字符串“Hello”中“H”的地址。

    下面是一个循环:

    while (*p++)

    这里面的*p++是什么意思呢?一般初学者都会有下面的几种疑惑:

    1. 前缀++和间接取值*的优先级。
    2. 后缀自增表达式的值的情况。
    3. 后缀自增表达式的副作用。

    1、优先级,快速察看一下运算符的优先级表可知后缀运算符的优先级(16)高于引用运算符(15)。也就是说*p++可以表示为*(p++),也就是说*是作用于p++的。先来看P++部分。

    2、后缀表达式值,p++的值是P++表达式的P之前的值。假设你有:

    int i = 7;
    printf("%d
    ", i++);
    printf("%d
    ", i);

    输出将会是:

    7
    8

    可以看到i++ 的值是i自增之前的值。那么P++也就是P自增之前的值。p中的值是“H”的地址。

    接下来*P++就很简单了,*代表取出p中目前地址所存放的值,也就是“H”。

    也许有同学会问,既然*p++表示“H”,那么为什么没有显示出来呢,下面就要说道副作用了。

    3、后缀表达式的副作用,后缀++表达式的值是当前变量的值,但是这个表达式运算过后会有副作用。回头再看一下上面的代码和输出。

    在第一个printf()函数中i++的值为7,但在C语言中会保证在下一条语句执行前的某个时刻(之所以说某个时刻是因为这个时刻和机器相关),这一条语句的副作用会产生,也就是说在第二条printf()执行前i的值一定会被加一。顺便提一下,这是C标准中少数几个有这样保证的副作用。

    在最前面的代码中,当*P++执行时他指向的是字符“H”,但之后p的值加一,最终在屏幕上显示的就是ello了。

  • 相关阅读:
    mysql安装与基本管理,mysql密码破解
    非阻塞IO模板
    多路复用IO模板
    第四模块:网络编程进阶&数据库开发 练习
    理解Queue队列中join()与task_done()的关系
    第四模块:网络编程进阶&数据库开发 口述
    SQLite
    rest_cherrypy
    SaltStack Returners
    kafka集群安装,配置
  • 原文地址:https://www.cnblogs.com/programnote/p/4716189.html
Copyright © 2011-2022 走看看