首页 > 试题广场 >

下列程序的输出结果是?

[单选题]
下列程序的输出结果是
#include<iostream>
using namespace std;

int main()
{
    int a[] = {2, 4, 6, 8, 10}, *p, **k;
    p = a;
    k = &p;
    printf(" % d", *(p++));
    printf(" % d\n", **k);   
    return 0;
}

  • 4 4
  • 2 4
  • 2 2
  • 4 6
推荐
答案:B
注意 P++ 操作后,p的指针已经指向a的第二个。
编辑于 2015-02-05 11:30:44 回复(10)
我这里有个疑问 就算是用括号括起来之后的的话(p++)仍然要在赋值之后才会自吗?不会自加完之后再运算外面的??
发表于 2017-12-02 00:17:00 回复(0)
k是指向p的地址的地址,*k是p的地址,**k是p中存储的内容,注意p++取的是p的值,然后p才+1
发表于 2016-03-04 16:56:20 回复(0)
*p++和*(p++)都是先取*p的值再将p自增
发表于 2015-07-17 22:08:00 回复(1)
a 指向数组第一个元素 
p = a
*(p++) 这里是先取p值做解引用,然后p再自增
如果是*(++p) 则是p自增后,再做解引用
*(p+1) 则是对(p+1)的值解引用

所以*(p++) 仍旧是第一个元素的值
解引用之后 p指向第二个元素, k = &p 则 **k为4;
发表于 2015-09-19 13:48:04 回复(2)
k指向p,就是说k变量的值是p变量的地址, p++后,p指向了a[1], *k=p, **k=*p=a[1] 因为p已经自加了,指向a[1] 如果解决了您的疑惑,请给我点个赞
发表于 2017-07-21 19:15:55 回复(0)
看了一下多数人答案,基本都是说因为p++了所以k指向4。虽然没有错,但是小弟感觉这么解释是有悖该题初衷的。其实这道题的考点在二级指针上。先说一下我的答案,我选的是C,因为把k看成单指针了,而且早上有点困一眼也没有扫到k=&p这句话(如果k是单指针,编译器会报错的),所以选错了。如果k是单指针,它的指向应该是与p同指,因此不管p再怎么变,k还是指向p最先指向的地方。(类似链表)
由于k二级指针,因此k指向的是p,也就是说*k的内容是p的地址,而**k就是*p也就是p的指向。由于p++所以导致**k的结果变成了4。不知道各位大佬觉得小弟这么解释合不合理。
发表于 2017-12-12 10:15:39 回复(2)
int a[] = {2, 4, 6, 8, 10}, *p, **k;
p = a;
k = &p;
cout<<p<<endl;                       //002FF8A8
printf(" % d\n", *(p++));            //2
cout<<p<<endl;                       //002FF8AC
printf(" % d\n", **k);  //4,其中*k的值是p

发表于 2015-08-20 20:23:06 回复(0)
这里虽然后面加了括号,但是后置++|是先返回当前值再自增的,所以应该是先取出q的值,然后q再指向下一位置
发表于 2016-09-28 18:14:10 回复(0)
*(p++)也是先取*p的值再将p自增
发表于 2022-02-15 15:54:01 回复(0)
*p++和*(p++)都是先取*p之后再++ *(++p)是先++,后解引用
编辑于 2020-04-12 12:08:26 回复(1)

永远记住 后置++在一个表达式里面的话 永远等表达式算完了再去管它 计算表达式值的时候无视它!!!

发表于 2018-12-25 15:54:42 回复(0)
*p++ = (*p)++,++*p = ++(*p),*++p = *(++p),*p++ = (*p)++,++*p = ++(*p),*++p = *(++)p
发表于 2018-07-18 16:07:45 回复(0)
这么理解就对啦,int a=1,int *b=&a;a++; 那*b不就是2嘛
发表于 2019-10-19 19:26:03 回复(0)
不是先把p的地址给k吗,然后改变p的地址 这个时候k的值是不会变的吧,还是p原先的地址 所以我觉得应该是2  2 啊 ,是不是我哪里想错了,求大神赐教啊
发表于 2017-10-24 14:24:01 回复(2)
p的改变,不会影响k吧?
发表于 2017-06-26 16:58:35 回复(0)
p指向a的首地址;
k取指针p的地址;
*(p++)先输出*p也就是值,再执行p++,此时p指向a[1];
**k就是指向a[1]的值

发表于 2023-09-05 21:37:44 回复(0)
p++, p先做运算,然后再p再做++运算
发表于 2022-07-31 11:01:02 回复(0)

Remember that both postfix and unary forms of ++ and -- have a result and a side effect:

  • The result of x++ is the current value of x - as a side effect, x is incremented by 1 (if x is a pointer, it is incremented to point to the next object in a sequence);

  • The result of ++x is the current value of x plus 1 - as a side effect, x is incremented by 1 (if x is a pointer, the result is the address of the next object in a sequence, and x is updated to point to the next object in a sequence);

发表于 2022-05-27 10:50:04 回复(0)
*p++和*(p++)都是先取*p的值再将p自增
发表于 2021-11-15 16:31:21 回复(0)
考查的指针本质  k = &p; 把k指向p的内存首地址 。注意赋值 复制 指针概念区分开就行。下一步p的指针被移动 则k指向也跟着变化
发表于 2021-09-02 13:59:42 回复(0)