首页 > 试题广场 >

下述程序的输出结果是?

[单选题]
下述程序的输出是______。
#include<stdio.h>

int main()
{
    static char *s[] = {"black", "white", "pink", "violet"};
    char **ptr[] = {s+3, s+2, s+1, s}, ***p;
    p = ptr;
    ++p;
    printf("%s", **p+1);
    return 0;
}

  • ink
  • pink
  • white
  • hite
发表于 2015-04-02 10:13:07 回复(19)
**p指向了“pink”所以**p+1就应该指向ink
发表于 2015-09-02 09:45:55 回复(0)
答案是A。
----------------------------
因为++p后,p指向violet中的i,**p是指向数组中字符串的指针,**p+1后指向下一个字符串(pink)的第二个字符。打印出来就是ink
编辑于 2021-08-19 17:20:48 回复(10)
首先 s是一个指针数组, 存的是字符串的首地址
char **ptr[] 是一个还是一个指针数组,不过是一个二级指针数组,存的是s这个数组中,每个元素的地址
p是一个三级指针,ptr这个二级指针数组的数组名也是一个三级指针,
p++只是往后跳了一个元素的位置,*p就是第二个元素的内容,也就是指向s数组中s+3这个元素的地址,
    **p就得到了s数组中s+3这个元素的内容, s数组中保存的是字符串的首地址,那就得到了"pink"这个元素的首地址,
在**p+1就是这个地址向后偏移一个字节,也就指到了'i'上,
所以 %s, **p+1还是"ink"

发表于 2015-11-22 00:36:36 回复(1)
*p <=> ptr[i]
**p <=> s[i]
***p <=> char
发表于 2015-09-25 20:53:15 回复(0)
p = ptr;
++p;
所以 *p = ptr[1] =s+2;
**p =&(s+2 )=  &"pink";
**p + 1 = &"ink";
所以结果是ink;
编辑于 2016-06-03 23:12:52 回复(1)
s是一个指针,指向一个数组,该数组中的每一个元素是char*类型,即"black", "white", "pink", "violet"
ptr是一个指针,也指向一个数组,该数组中的每一个元素是char**,即存放violet的地址,pink的地址,white的地址,black的地址,也即指向violet,pink,white,black字符数组的指针.
p和ptr一样,p也指向ptr指向的数组,
++p:p指向指向pink的指针.
*p取到了存放pink的地址
**p:p指向pink的指针
**p+1:指向了ink

发表于 2019-05-09 17:42:44 回复(0)
s + 1 会调到字符串数组的第一个索引的位置
因此数组 ptr 指向的三个储存的三个串分别是
{"pink", "white","black", "black"}

将 ptr 赋值给 p 后,p 就丢失了数组信息,这是对其执行 +1 操作只是对字符操作罢了。因此 ++p 指向的是 ink\0 。打印截止到 \0 为止
发表于 2021-08-24 11:46:48 回复(0)
    staticchar*s[] = {"black","white","pink","violet"}; //定义一个一级指针数组s
    char**ptr[] = {s+3, s+2, s+1, s}, ***p;     //定义一个二级指针数组ptr,定义一个三级指针p
    p = ptr;                                                   //三级指针p指向了数组ptr,p指向s+3,p+1指向s+2,p+2指向s+1,p+3指向s,*p=s+3
    ++p;                                                       //p=p+1,此时p指向s+2,
    printf("%s", **p+1);                                //*p=s+2,**p=*(s+2)=pink,**p+1=ink   这个+1使地址位移了一个char长度
    return0;

总结:
1.*(p--),先进行*运算,在进行自减
2.*(--p),先进行自减,在进行*运算
3.对于二维数组a,a+n表示第n行的首地址
4.对于二维数组a,&a[0]表示第n行的首地址
5.对于二维数组a,a[0]+n表示第0行第n个元素的地址
6.对于二维数组a,*(*(a+n)+m)表示第n行第m个元素的地址
7..对于二维数组a,*(a[n]+m)表示第n行第m个元素的地址
编辑于 2020-03-01 22:07:17 回复(0)
发表于 2016-04-14 19:41:14 回复(0)

代码中定义了一个静态字符指针数组s,其中包含四个字符串。然后定义了一个指向字符指针的指针数组ptr,其中存储了s数组中各元素的地址,但是顺序颠倒了。

最后声明了一个指向指针数组的指针p,并将其初始化为ptr的地址。接着将p的值加一,使其指向第二个指针数组元素。

在打印printf语句中,使用了间接寻址运算符**p来访问ptr数组中第二个元素,即指向s+2的指针。由于**p实际上是*(*p),因此我们得到了指向s+2的指针s[2]。

然后,使用+1运算符访问字符串"pink"的第二个字符,即'i',并将其作为一个字符串打印出来。因此输出结果是ink。

发表于 2023-10-31 10:17:06 回复(0)
这段代码定义了一个静态的字符串指针数组s,其中存放了4个字符串常量。定义了另外一个指针的指针数组ptr,它包含了s数组中每个字符串指针的地址,但是是倒序的。定义了一个三级指针p,将它指向了ptr数组的首地址。执行++p操作,使得p指向了ptr数组的第二个元素,即指向了s+2。然后执行printf语句,输出p指向的元素的第二个字符开始的字符串,即输出"ink"。最后程序返回0,结束执行。
发表于 2023-04-04 11:39:13 回复(0)
char **ptr[] 是一个还是一个指针数组,不过是一个二级指针数组,存的是s这个数组中,每个元素的地址 p是一个三级指针,ptr这个二级指针数组的数组名也是一个三级指针, p++只是往后跳了一个元素的位置,*p就是第二个元素的内容,也就是指向s数组中s+3这个元素的地址, **p就得到了s数组中s+3这个元素的内容, s数组中保存的是字符串的首地址,那就得到了"pink"这个元素的首地址, 在**p+1就是这个地址向后偏移一个字节,也就指到了'i'上, 所以 %s, **p+1还是"ink" 这个解法真的妙
编辑于 2022-03-03 18:11:11 回复(1)
p = ptr即p 指向s+3;p++变成s+2对应为pink;**p+1 即*(*(s+2)+1),即pink数组从下标为1的位置输出,觉得绕画个图就很明白了
发表于 2023-12-23 10:41:28 回复(0)
**p指向了pink +1则为ink
发表于 2023-05-11 15:52:42 回复(0)
优先级中++/-->*>+/-,所以**p+1先计算**p后计算+1
发表于 2022-02-22 09:57:34 回复(0)
P都不定义一下就用的,什么鬼
发表于 2021-06-28 14:13:23 回复(0)
*p=s+2 *(s+2)=&(pink) **p=*(s+2)=&("pink") **p+1=&("pink")+1 printf("%s",**p+1); "ink"
发表于 2021-03-18 15:10:28 回复(0)
我觉的最后这个**p 是关键,找到p指向pink很容易,这个指针移动加一稍有不慎就会写成white,这个指针加一是在本行移动了一个字符的位置。
发表于 2020-08-24 22:16:22 回复(0)
++p后,p指向s+2,*p为s+2,**p相当于*(s+2),因为s是指针数组,所以s+2指向的是"pink"的地址,故此**p指向的是"pink"的首地址,**p+1指向下一个字符,所以最后输出"ink"
发表于 2019-10-10 18:05:01 回复(0)