#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
求大神解答!!!
能有明白人给说说么
因为++*pt加过一次了
很么是 解除指针引用? 为什么加过了值不能改变?
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;
没明白 (*pt)++是不会修改数据的
(*pt) 已经是 值为 24.4一个double的数了,为什么再++不会变成 25.4呢?
@凡图: 是我错了。
cout<<(*pt)++<<endl;
是先使用后自增,也就是说等价于:
cout<<(*pt)<<endl;
(*pt)++
@凡图: 你可以检查看,arr[2]是多少,此外,语句修改为上一条,可以看结果。
@519740105: 你说的不对,你能调试下看看行么。完全不知道你说的什么
@凡图:
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]
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
补充一下吧:
*p++, (*P)++, *(p++)
*p++ 和 *(p++) 是一样的。。先用p, 然后根据优先级, 取p指向的地址的值,p自加到下一个地址
而 (*P)++,是取p指向地址的值。然后改变当前地址里的值自加
犀利!!!
再问下,为什么:cout<<(*pt)++<<endl; ||==>> pt=0x3 , 先取值 *pt = 23.4 , 然后加加 24.4, 注意这里的pt指向单元值会变?
@杨小聪: 哦 明白了, *p++ 和 *(p++) 是一样的,这个是因为C++右结合性,这个知道。
(*P)++,是取p指向地址的值。然后改变当前地址里的值自加,这个是刚知道!!
@凡图: 这个上面那个老鸟不也说了。比如你正常用*P作为参数传给调用函数的话。你用(*P) = 2这个会不会使原来的值改变呢?
int b(int *p){
*(p)++
}
int a()
{
int x =1;
b(&x);
}
一个道理啊
@杨小聪: 敲错了。。。。 函数b里(*p)++
@杨小聪:
cout<<++*pt<<endl; ||这个为什么 指向的单元内容不变呢?
cout<<(*pt)++<<endl; ||注意这里的pt指向单元值会变
@凡图: 这个也会变,晕我上面写错了/???
@杨小聪: 晕,没写错 是没写
@杨小聪: 这么说吧。你直接看是先取值还是先移动地址,,如果先取值后++。当前的地址的值就会变。
如果是先移动地址再取值。只是起到一个取值效果。不改变其它值。
@杨小聪:
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
@凡图:
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
上面是写错了哎。
@杨小聪: 哈哈你这个输出错误哦!!http://www.cnblogs.com/holyson/p/3964115.html 这里有这段代码运行结果
@凡图: - -
@杨小聪: 要是很简单 我就不提问了哦!!虽然C++是新手,C#自认为还不错的
@凡图: 感觉被你忽悠了 T-T