理解*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\n", i++);
printf("%d\n", 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了。

转载于:https://www.cnblogs.com/programnote/p/4716189.html

你可能感兴趣的:(理解*ptr++)