我正在尝试学习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]);
}
答案 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)