2015-02-07 34 views
-1
#include <stdio.h> 
void fun(char**); 

int main() 
{ 
    char *argv[] = {"ab", "cd", "ef", "gh"}; 
    fun(argv); 
    return 0; 
} 
void fun(char **p) 
{ 
    char *t; 
    t = (p+= sizeof(int))[-1]; 
    printf("%s\n", t); 
} 

有人可以解释我指派t =(p + = sizeof(int))[ - 1]; ..给出的ANS是CD ..有人可以解释这个任务,双指针和输出

+0

如果这是从某种类型的教育课程的实际分配和答案表述为'cd',我真诚的建议是跑了一英里。 – NPE 2015-02-07 21:24:51

+0

p增加int大小,然后通过选择右边的索引来解除引用。这在技术上是未定义的行为,因为程序不能真正做负数组索引。 – 2015-02-07 21:25:33

+0

当然你可以使用负指数。只要在负指数结果中添加一个有效的指针即可。 – gnasher729 2015-02-07 21:26:26

回答

0

此代码是为了迷惑你。解释它并不会真的有帮助,因为它会阻止你学习理解写得不好的代码。

这段代码很可能是在8位和16位计算机中编写的,当时sizeof(int)是2.假设sizeof(int)= 2,并仔细检查代码步一步一步。

+0

活计,你可以说我什么双指针呢.. @ gnaher – 2015-02-07 21:29:36

+0

@SivaPraveen:同一个指针,但对于指针。 – Deduplicator 2015-02-07 21:30:53

+0

@Siva Praveen:没有像“双指针”这样的独立概念。 “双指针”只是一个普通的单指针。恰好碰巧指出对象恰好也是一个指针。 – AnT 2015-02-07 21:37:13

0

它非常糟糕的代码,答案是“CD”,因为p为第一加2,并设置为P [2],从p [0]。然后减1,并设置为指向字符串“cd”的p [1]。它是一个双指针,因为字符串“cd”本身会生成一个指针。

答案取决于你的系统上,在大多数系统上它会指向P [3]。

我同意这个代码被写入迷惑你。

0

**p initally包含argv[0]元件即"ab"。它的地址然后由2(给定为2个字节整型尺寸)。现在它指向"ef"。它然后通过-1递减。所以最后指向"cd"递增因此它将t的值打印为"cd"

你可以找到我的答案here

相关问题