我正在尝试学习C语言中的指针。但我有一个关于取消引用它们的问题。
这段代码工作得很好,它按照我的意愿显示“我”。
#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'终结符。所以我认为也可以在这里显示单个字符。
#include <stdio.h>
void myfunction(char** str);
int main()
{
char *name = "Gianni";
myfuntion(&name);
return 0;
}
void myfunction(char** str){
printf("%c", *str[1]);
}
这是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)