取消引用指针混乱

时间:2017-12-29 19:56:23

标签: c

我正在尝试学习C语言中的指针。但我有一个关于解除引用它们的问题。

这段代码工作正常,它按照我的意愿显示“我”。

代码-1

#include <stdio.h>

void myfunction(char** str);

int main()
{
    char *name = "Gianni"; 
    myfuntion(&name); 
    return 0;
}

void myfunction(char** str){

    char* test = *str;
    printf("%c", test[1]);
}

但我猜测得到的结果却相同,结果有点不同。我的问题是为什么我从第二段代码中得不到相同的结果?

我取消引用指针,使其再次指向第一个字符并可以读取它直到'\ 0'终结符。所以我认为也可以在这里显示单个字符。

代码-2

#include <stdio.h>

void myfunction(char** str);

int main()
{
    char *name = "Gianni"; 
    myfuntion(&name); 
    return 0;
}

void myfunction(char** str){
    printf("%c", *str[1]);
}

1 个答案:

答案 0 :(得分:5)

这是precedence问题。(数组下标[]的优先级高于取消引用*)。你应该试试

(*str)[1]

这将为您提供正确的结果。在早期的案例中(在代码2中),您有undefined behavior。您正在取消引用str[1],它指向超出范围的内存。

所以最初你在Code-2中做了什么

*str[1] --> *(*(str+1))

现在我们做了什么,

(*str)[1] --> *((*str)+1)

在修改中你基本上得到了数组的地址(字符串文字是衰减成指针的数组),然后你索引到正确的位置 - 这将给你正确的结果。

如果你查看前面的例子,你会看到相似之处。早期代码(代码1)您打印的temp[1] *(temp+1)temp是什么?在您执行此操作之前的行中temp = *str那么您正在做什么?

*(temp+1) --> *(*str+1) --> *((*str)+1)