首页 > 试题广场 >

turbo c环境下,下面程序运行的结果是?

[单选题]
turbo c环境下,下面程序运行的结果是()
#include <stdio.h>
int main() {
    printf("\n");
    int a[5] = {1, 2, 3, 4, 5};
    int *p, **k;
    p = a;
    k = &p;
    printf("%d", *(p++));
    printf("%d", **k);
    return (0);
}
  • 11
  • 21
  • 22
  • 12
推荐
答案 D

p存放的是a的地址
k 存放的是p指针的地址
p++ p指针存放的内容改变了,k的指向没有变,但K的值改变了。
编辑于 2015-02-06 15:06:22 回复(2)
题目巧妙
发表于 2016-06-17 17:01:20 回复(0)
程序首先定义了一个一维数组a,赋其初值,并定义一个同类型的指针变量p和一个指向指针的指针变量k,然后让指针变量p指向数组的首地址,接着将指针变量p的地址值赋给指向指针的指针变量k。在第一条输出语句中,首先我们需要弄清楚*(p++)的作用,它是先调用指针变量p的值,然后使其自加,输出效果等价于*p,因此,最后输出的结果是数组中的第一个元素。在第二条输出语句中,我们需要弄明白**k的作用,指向指针的指针变量类似于指针变量,如果用**k表示一个数值,可以确定这条输出语句的输出结果是一个数值,而非地址,从表达式k=&p可以看出,k的值是指针变量p的地址值,p的值改变后,k能实时得到改变,那么在第一条输出语句对p的改变,在第二条输出语句中得到了体现。因此,**k输出的是数组中的第二个元素.
发表于 2015-08-20 23:20:09 回复(7)
C++Primer解释:
后置递增运算符的优先级高于解引用运算符,因此*p++等价于*(p++)。p++把p的值加1 ,然后返回p的初始值的副本作为其求值结果,此时解引用运算符的运算对象是p为增加之前的值,即后置递增运算符返回初始的未加1的值。
发表于 2015-04-27 14:27:18 回复(2)

*p++ 和 *(p++) 都是先取p指向的值,再让p指向下一个位置.
(*p)++ 先取p指向的值,再让这个指向的值+1,并且修改了对应数组中的值 .
k指向p,**k取p指向的值,p指向哪里,**k取哪里的值.               

发表于 2015-12-03 19:42:30 回复(0)
*p++等价于*(p++),先*p输出1,之后p++,p指向第二个元素; *k指向的是p,即**k 等价于 *(p) ,输出2
发表于 2017-08-15 11:57:05 回复(0)
答案选D
*(p++) 先执行p++,返回的依旧是执行前的p,*(p++)等价于先*p,再p++;所有先输出1。
**k 首先*k是取k指向内存的数据,由于第一个printf执行后p增加了1,所有*k等价于p+1;**k等价于*(p+1),所有输出2
发表于 2021-03-15 14:41:32 回复(0)
其实也可以这样想,p++是执行完当前语句后p再自加,(p++)不是一条语句,在执行完语句之前p是原值,于是*(p++)取*p,在printf语句结束后p再自加。
编辑于 2018-04-25 08:05:26 回复(0)
k本身没变,*k变了。
发表于 2016-07-10 01:24:01 回复(1)
*(p++) = 1;
*(++p) = 2;
发表于 2023-07-29 00:00:08 回复(0)
大家注意:
*(p++)是后置自增。如果换成前置自增,那么结果就是22。
ps:后置递增运算符的优先级高于解引用运算符
发表于 2018-03-08 11:28:48 回复(0)
编译环境VS2015,64位系统

可以看到执行printf后,k的值没有变,因为并没有对k操作,变化的是*k,因为k的地址A存储的值是p的地址B,p的地址变了。
a[0]的值并没有变,只是p指向a[1]了

但是没明白为什么printf("%d", *(p++));输出的会是1.  *(p++)这个语句是先执行*吗?我查了下优先级,小括号的优先级比*高一点啊,如果先执行括号内的话我觉得输出应该是2才对啊。求解答
编辑于 2018-01-23 16:50:02 回复(1)
*(p++) ==> 先获取*p,然后p=p+1,因此结果为1
p的指向后移1位,但是p的地址没有变,依旧是a的首地址,因此**k = *(&p)=*a = 1
发表于 2016-02-25 15:40:54 回复(0)
D
主要是*(p++)的运算顺序。先*p,再自增。
发表于 2015-04-05 19:55:34 回复(2)
p是一级指针,k是二级指针。p中存放的a的地址,k中存放p的地址。p指向a,k指向p.
注意前++和后++的区别, ++i,和i++的区别。++i,是先加加,后使用i,i++是先使用i,后i=i+1.
第一个输出,   *(p++),   === *p++,    *和++是同一优先级,结合方向从右向左。先使用后++,故输出为1,但是指针内保存地址的空间内容已经改变。
第二个输出,解引用,第一次* 输出k指向的空间内容,第二次*, 输出p指向的空间内容,为2.
发表于 2023-08-07 21:13:51 回复(0)
*p++它相当于*(p++),首先指针p后移,由于对指针是后缀加,所以p++返回p没后移时的指针,如果是数组,那么表达式的值为指针当前所指元素(指针没有后移时)的值


发表于 2022-05-02 19:31:05 回复(1)
注意k存放的是p指针的地址,在P++后,k的值发生了变化。
发表于 2016-05-18 20:56:10 回复(1)
*p++和*(p++)其实是一样的,都是先解引用,然后再++,这里这样写是故意迷惑:先++,再解引用
发表于 2015-08-16 12:44:37 回复(0)
p++是先使用,再++,又习惯性的想错了!!!!
发表于 2023-11-04 11:19:07 回复(0)
程序首先定义了一个一维数组a,赋其初值,并定义一个同类型的指针变量p和一个指向指针的指针变量k,然后让指针变量p指向数组的首地址,接着将指针变量p的地址值赋给指向指针的指针变量k。在第一条输出语句中,首先我们需要弄清楚*(p++)的作用,它是先调用指针变量p的值,然后使其自加,输出效果等价于*p,因此,最后输出的结果是数组中的第一个元素。在第二条输出语句中,我们需要弄明白**k的作用,指向指针的指针变量类似于指针变量,如果用**k表示一个数值,可以确定这条输出语句的输出结果是一个数值,而非地址,从表达式k=&p可以看出,k的值是指针变量p的地址值,p的值改变后,k能实时得到改变,那么在第一条输出语句对p的改变,在第二条输出语句中得到了体现。因此,**k输出的是数组中的第二个元素.
发表于 2022-05-15 14:31:46 回复(0)
这个问题关键就是这个p是个二级指针,是和这个a关联的,仅此而已
发表于 2020-09-12 13:19:57 回复(0)