首页 新闻 会员 周边

请问一下一个C++的解除指针问题

0
悬赏园豆:10 [待解决问题]
#include "stdafx.h"
#include <iostream>
int main()
{
    using namespace std;
    double arr[5]={21.1, 32.8, 23.4, 45.2, 37.4};
    double *pt=arr;
    ++pt;
    double x;
    cout<<*++pt<<endl;
    cout<<++*pt<<endl;
    cout<<(*pt)++<<endl;
    cout<<*pt++<<endl;
    x=*pt++;
    cout<<x<<endl;
}

这行代码 cout<<(*pt)++<<endl;  为什么会输出:24.4

我认为是:25.4   

求大神解答!!!

C++
问题补充:

能有明白人给说说么

CTRA王大大的主页 CTRA王大大 | 初学一级 | 园豆:30
提问于:2014-09-10 11:39
< >
分享
所有回答(3)
0

因为++*pt加过一次了

吴瑞祥 | 园豆:29449 (高人七级) | 2014-09-10 11:48

很么是 解除指针引用? 为什么加过了值不能改变?

支持(0) 反对(0) CTRA王大大 | 园豆:30 (初学一级) | 2014-09-10 11:50
-1

cout<<++*pt<<endl;

输出的是24.4吧?

这条语句等价于:

int v = *pt;

++v;

cout<<v<<endl;

 

而语句:

cout<<(*pt)++<<endl;

跟上面的语句类似(无非是是否有括号,此时必须有括号,以及左自增与右自增的区别而已。)

 

事实上,你在上面两条语句后输出arr[2],结果是23.4。

 

对于数组,arr[2]++等价于arr[2] += 1;

而对于指针,(*pt)++是不会修改数据的,除非你:*pt += 1;

519740105 | 园豆:5810 (大侠五级) | 2014-09-10 12:02

 没明白  (*pt)++是不会修改数据的  

(*pt) 已经是 值为 24.4一个double的数了,为什么再++不会变成 25.4呢?

支持(0) 反对(0) CTRA王大大 | 园豆:30 (初学一级) | 2014-09-10 12:06

@凡图: 是我错了。

cout<<(*pt)++<<endl;

是先使用后自增,也就是说等价于:

cout<<(*pt)<<endl;

(*pt)++

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-09-10 12:11

@凡图: 你可以检查看,arr[2]是多少,此外,语句修改为上一条,可以看结果。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-09-10 13:37

@519740105: 你说的不对,你能调试下看看行么。完全不知道你说的什么

支持(0) 反对(0) CTRA王大大 | 园豆:30 (初学一级) | 2014-09-10 14:05

@凡图: 

    cout<<*++pt<<endl;//等价于cout<<arr[2]<<endl;
    cout<<++*pt<<endl;//等价于arr[2]++;cout<<arr[2]<<endl;
    cout<<(*pt)++<<endl;//等价于int tmp = arr[2]; cout<<tmp<<endl;tmp++;
    cout<<*pt++<<endl;//等价于int tmp=arr[2]; cout<<tmp<<endl;pt++;执行前pt指向arr[2],执行后pt指向arr[3]
    x=*pt++;//等价于x = *pt; pt++;执行前pt指向arr[3],执行后pt指向arr[4]

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2014-09-10 18:28
1

double arr[5]={21.1, 32.8, 23.4, 45.2, 37.4};

   假设地址: 0x1,  0x2, 0x3,  0x4, 0x5

 

double *pt=arr; ||==>> pt = 0x1, *pt = 21.1

++pt;        ||==>>  pt= 0x2

double x;   

cout<<*++pt<<endl;    ||==>>  pt=0x2 先加加 pt=0x3, 后取值*pt=23.4

cout<<++*pt<<endl;    ||==>>  pt=0x3 先取值*pt = 23.4, 后加加 24.4

cout<<(*pt)++<<endl;     ||==>> pt=0x3 ,  先取值 *pt = 23.4 , 然后加加 24.4, 注意这里的pt指向单元值会变

cout<<*pt++<<endl;        ||==>> pt=0x3,  先取值 *pt=24.4 ,然后加加 25.4

x=*pt++;         ||==>> pt=0x3, 先加加pt=0x3, 然后取值 *pt = 45.2

cout<<x<<endl;       ||==>> 45.2

杨小聪 | 园豆:216 (菜鸟二级) | 2014-09-10 15:21

补充一下吧:

  *p++, (*P)++, *(p++)

 

  *p++ 和 *(p++) 是一样的。。先用p, 然后根据优先级, 取p指向的地址的值,p自加到下一个地址

 而 (*P)++,是取p指向地址的值。然后改变当前地址里的值自加

支持(0) 反对(0) 杨小聪 | 园豆:216 (菜鸟二级) | 2014-09-10 15:26

 犀利!!!

再问下,为什么:cout<<(*pt)++<<endl;     ||==>> pt=0x3 ,  先取值 *pt = 23.4 , 然后加加 24.4, 注意这里的pt指向单元值会变?

支持(0) 反对(0) CTRA王大大 | 园豆:30 (初学一级) | 2014-09-10 15:29

@杨小聪: 哦 明白了, *p++ 和 *(p++) 是一样的,这个是因为C++右结合性,这个知道。

(*P)++,是取p指向地址的值。然后改变当前地址里的值自加,这个是刚知道!!

支持(0) 反对(0) CTRA王大大 | 园豆:30 (初学一级) | 2014-09-10 15:31

@凡图: 这个上面那个老鸟不也说了。比如你正常用*P作为参数传给调用函数的话。你用(*P) = 2这个会不会使原来的值改变呢?

int b(int *p){

  *(p)++

}

int a()

{

  int x =1;

  b(&x);

}

一个道理啊

支持(0) 反对(0) 杨小聪 | 园豆:216 (菜鸟二级) | 2014-09-10 15:31

@杨小聪: 敲错了。。。。 函数b里(*p)++

支持(0) 反对(0) 杨小聪 | 园豆:216 (菜鸟二级) | 2014-09-10 15:33

@杨小聪: 

cout<<++*pt<<endl;    ||这个为什么 指向的单元内容不变呢?

cout<<(*pt)++<<endl;     ||注意这里的pt指向单元值会变

支持(0) 反对(0) CTRA王大大 | 园豆:30 (初学一级) | 2014-09-10 15:34

@凡图: 这个也会变,晕我上面写错了/???

支持(0) 反对(0) 杨小聪 | 园豆:216 (菜鸟二级) | 2014-09-10 15:40

@杨小聪: 晕,没写错 是没写

支持(0) 反对(0) CTRA王大大 | 园豆:30 (初学一级) | 2014-09-10 15:41

@杨小聪: 这么说吧。你直接看是先取值还是先移动地址,,如果先取值后++。当前的地址的值就会变。

如果是先移动地址再取值。只是起到一个取值效果。不改变其它值。

支持(0) 反对(0) 杨小聪 | 园豆:216 (菜鸟二级) | 2014-09-10 15:42

@杨小聪: 

cout<<*++pt<<endl;    ||==>>  pt=0x2 先加加 pt=0x3, 后取值*pt=23.4

cout<<++*pt<<endl;    ||==>>  pt=0x3 先取值*pt = 23.4, 后加加 24.4,既然这里pt指向的值改变

cout<<(*pt)++<<endl;     ||==>> pt=0x3 , 为什么 先取值 *pt = 23.4(而不是24.4呢?) , 然后加加 24.4, 注意这里的pt指向单元值会变

cout<<*pt++<<endl;        ||==>> pt=0x3,  先取值 *pt=24.4 ,然后加加 25.4

支持(0) 反对(0) CTRA王大大 | 园豆:30 (初学一级) | 2014-09-10 15:44

@凡图: 

double arr[5]={21.1, 32.8, 23.4, 45.2, 37.4};

   假设地址: 0x1,  0x2, 0x3,  0x4, 0x5

 

double *pt=arr;      ||==>> pt = 0x1, *pt = 21.1

++pt;              ||==>>  pt= 0x2

cout<<*++pt<<endl;    ||==>> pt初值0x2, 先加加 pt=0x3, 后取值*pt=23.4

cout<<++*pt<<endl;    ||==>> pt初值0x3  先取值*pt = 23.4, 后加加 24.4, 这里会改变原值arr[2] = 24.4, 运算完使用表达式值

cout<<(*pt)++<<endl;     ||==>> pt初值0x3 ,  先取值 *pt = 24.4 , 然后加加 25.4, 这里会改变原值arr[2] = 25.4,先使用表达式的值后在加加

cout<<*pt++<<endl;        ||==>> pt=0x3,  先取值 *pt=25.4 , pt指向下一个单元 0x4

x=*pt++;         ||==>> pt=0x4, 然后取值 *pt = 45.2 然后pt指向下一个单元0x5

cout<<x<<endl;       ||==>> 45.2

 

上面是写错了哎。

支持(0) 反对(0) 杨小聪 | 园豆:216 (菜鸟二级) | 2014-09-10 15:50

@杨小聪: 哈哈你这个输出错误哦!!http://www.cnblogs.com/holyson/p/3964115.html 这里有这段代码运行结果

支持(0) 反对(0) CTRA王大大 | 园豆:30 (初学一级) | 2014-09-10 15:51

@凡图: - -

支持(0) 反对(0) 杨小聪 | 园豆:216 (菜鸟二级) | 2014-09-10 15:55

@杨小聪: 要是很简单 我就不提问了哦!!虽然C++是新手,C#自认为还不错的

支持(0) 反对(0) CTRA王大大 | 园豆:30 (初学一级) | 2014-09-10 15:55

@凡图: 感觉被你忽悠了 T-T 

支持(0) 反对(0) CTRA王大大 | 园豆:30 (初学一级) | 2014-09-10 15:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册