取消引用指针混乱

问题描述 投票:1回答:1

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

这段代码工作得很好,它按照我的意愿显示“我”。

Code-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'终结符。所以我认为也可以在这里显示单个字符。

Code-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]);
}
c
1个回答
5
投票

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

(*str)[1]

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

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

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

现在我们做了什么,

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

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


好吧,如果你查看前面的例子,你会看到相似性。早期代码(Code-1)你打印temp[1]这是*(temp+1)但什么是temp?在你做这个temp = *str之前的那一行,那么你在做什么?

*(temp+1) --> *(*str+1) --> *((*str)+1)
© www.soinside.com 2019 - 2024. All rights reserved.