首页 > 试题广场 >

阅读下面代码,程序会打印出来的值是?

[单选题]
阅读下面代码,程序会打印出来的值是?
#include <stdio.h>

void f(char **p) { *p += 2; }
void main() {
    char *a[] = {"123", "abc", "456"}, **p;
    p = a;
    f(p);
    printf("%s", *p);
}



  • 123
  • abc
  • 456
  • 3
推荐
*p+=2;就相当于*p=*p+2;
其中*p指向字符串“123”的第一个元素,即‘1’,指针p向后移两个元素的地址,即指向‘3’
而*(p+2)才是基于p每次向后移一个字符串的长度,即*(p+2)指向“456”
编辑于 2015-12-15 10:27:03 回复(15)
优先级比较:解引用运算符*  >  +=运算符
发表于 2018-03-06 17:41:28 回复(0)


1.调用f前:


2.调用f后


从图中可以看出,调用f函数的前后,a[1]处地址已经发生变化。
编辑于 2017-07-21 17:16:59 回复(4)
这段代码是错误的。
p=a 此时a转换为指向数组首元素的指针,即是char**类型 等价于&a[0]
所以*p为char*类型指向“123”,等价于a[0],实质是指向字符数组“123”的第一个字符,若再次解引用则为第一个字符本身
*p+=1指向“123”中的第二个字符
此时printf("%s\r\n",*p)输出23
printf("%c\r\n",**p)输出2

此题无论改为printf("%c\r\n",**p) 还是printf("%s\r\n",*p)都会输出3,前者为字符,后者为字符串

编辑于 2015-04-07 21:30:53 回复(4)
*p += 2等价于 *p = (*p)  + 2,而p是指向二维数组的,故*p又等价于p[0],p[0] + 2就是p[0][2],也就是a[0][2]。
这道题考察点其实不在于运算符优先级,关键在于二维数组与指针的关系
发表于 2016-06-14 21:11:33 回复(0)
p 的类型是 char**, *p 的类型是 char*,
已知:p = {地址1, 地址2, 地址3},故有:*p = 地址1 = “123”
不妨假设 char *s = *p,故 s = 地址1 = “123”
故 *p += 2 即 s += 2 得, s = "3"
答案选最后一个 3

发表于 2016-08-02 09:44:53 回复(0)
该题考察的是运算符的优先级。
*属于第2类优先级,本类优先级从右到左结合
+属于第5类优先级,从左到右结合
故*p = *p+2等价于*p = (*p)+2,这就明白了。指向的是p[0][2],故也就是3.
故此时*p指向的是"3",所以输出字符串就是字符 3
编辑于 2015-12-14 11:01:00 回复(0)
a变量是保存"123\0abc\0456"字符串的地址的地址,p指向a,*p是字符串"123\0abc\0456"的地址,*p+2指向“3\0abc\0456",打印结果为3
发表于 2015-09-09 15:26:55 回复(0)
char **p表示二级指针,p保存一级指针char *的地址
所以*p的值就是char *的地址,所以f(p)的功能就是让保存的char *的地址加2。
char *a[]是一个指针数组,它包含三个char *指针的元素,分别指向字符串常量"123"、"abc"、"456"的首地址,因为在内存中他们相邻,又123、abc都是3个字节,所以三个地址值都差3,可以通过printf("%p %p %p\n", a[0], a[1], a[2]);验证
而a等价于&a[0],所以p的值为&a[0],*p即等价于a[0],即指向"123"的首地址"1",*p+2即指向3,所以答案为3

发表于 2018-03-09 23:02:31 回复(0)
我就想说那么多顶那个 456 答案的同学自己跑过代码没~~

编辑于 2017-07-27 15:26:19 回复(1)
首先了解指针数组 a显然是指针数组。指针数组内每一个内存中装的不是普通的数而是指针 也就是a[0],a[1],a[2]都是指针,指向三个字符串。 p = a相当于把a[0]赋给了p 然后捋一捋*p与**p *p是a[0]的值 **p就是a[0]中指针指向的那块区域的值 *p+2是对a[0]+2 a[0]装的是123的地址并且char是一个字节型,把字符串看成另一个数组b[],b[0]是1。所以*p+2就是b[2]的值3 如果是**p那就是精确的值1了此时加减就是对1进行操作。
发表于 2021-12-26 23:14:05 回复(0)
如果函数f中的是“p += 2”,那么答案就是A了,因传入的p的值,值传递不会修改实参本体;如果把函数f的形参改为三级char指针,那么就选C了。
编辑于 2021-09-03 20:03:44 回复(0)
*p就是指向a{0]了啊,“123”,直接+2,就是3,大意了
发表于 2020-01-27 15:00:13 回复(0)
选D罩杯;
先说p和*p的运算,p指向a,所以p++就是向后移动一个字符串,*p指向一个字符数组,*p++向后移动一个字符。
然后,函数传参,传入的是p,p是不会变化的,但是p上存的地址*p可能改变,地址*p存的内容**p也可能变化,题目只修改了*p,也就是上面说的向后移动两个字符,所有就赶到了3。
发表于 2015-09-07 16:24:18 回复(0)
调用函数f传递的指针不是一个拷贝吗,在函数里改变拷贝指针的值不影响函数外指针的指向吧,个人觉得选A吧
发表于 2015-09-05 09:30:08 回复(7)
此时*p实际上指向了字符串“123”的首地址。*p=*p+2,此时的指向对象就是123字符串
发表于 2023-05-31 16:03:57 回复(0)
麻了
发表于 2023-04-11 17:21:06 回复(0)
输出456 *(p+=2) 输出3(*p)+=2
发表于 2022-04-07 09:17:38 回复(0)
大意了,可将此字符串数组看为一个 二位字符型数组就明白了。
发表于 2021-03-05 20:37:47 回复(0)
char *a[]申明了一个指针数组,数组中的元素为指针。*p+=2优先级为先执行*运算在执行+=
发表于 2019-07-10 15:24:53 回复(0)
cha *a[] 是一个指针数组,里边的元素都是指针。
p=a,即p指向了a,**p="123"
函数中**p是指向指针的指针,即*p是被指针指向的元素,也是一个指针,*p+=2,,即是在**p="123"中移动,指向3

发表于 2019-03-05 13:11:06 回复(0)