#include<stdio.h>
int main()
{
char str[25] = "helloworld";
printf("%s %s", &str+2,str+2);
return 0;
}
&str+2 和 str+2 这里的 str=&str 有什么区别。请帮我。
谢谢
#include<stdio.h>
int main()
{
char str[25] = "helloworld";
printf("%s %s", &str+2,str+2);
return 0;
}
&str+2 和 str+2 这里的 str=&str 有什么区别。请帮我。
谢谢
当你有一个数组时:str[xxx]
str给你数组开头的内存地址,所以str+2会指向"lloworld".
&str为您提供存储 str 的地址。所以通过打印 &str+2 你会有意想不到的行为。
&获取该变量的地址,而不是变量指向的值。但是,对于一个字符数组,该值将是该数组的开始(第一个插槽)。
&str+2获取内存位置str并添加2.
str+2获取开始的内存位置并添加 2 个字节(char= 1 个字节,查看指针算法)。
&str+2 最终给出了地址,但在 printf 语句中,我们使用 %s 所以它给输出一个垃圾值,对于 str+2,输出将是 llworld
检查此链接的输出编译几次,看看我们得到什么输出
如果没有别的,&str(因此&str+2)有错误的类型要传递给printf说明%s符。它需要char *(指向 的指针char),并且&str具有类型char (*)[25](指向 25char秒数组的指针)。将错误的类型传递给printf调用未定义的行为。
此外,&str指向一个长度为 1 的数组(它的元素是char长度为 25 的数组,并且只有一个),&str+2越界指针算术也是如此,因此是未定义的行为。
&str打印vailabel的地址,如'9'或十六进制'0x009'
str+2将打印lloworld,这里 +2 作为增量值
str + 2 是指向字符串第三个符号的指针,&str + 2 是指向字符串指针加 2 的指针
str 是指向字符的指针(数组中的第一个字符)。&str 是指向字符数组的指针。
当我们执行 str+2 操作时,增加了 2 个字节。(因为它本质上是一个 char 指针)。当我们执行 &str+2 操作时,增加了 22 个字节。(因为字符数组的长度为 11 个字节)。
这是唯一的区别。
问候, 纳加拉吉
您可以尝试以下代码以供参考!
#include<stdio.h>
int main()
{
char str1[11] = "1111111111";
char str2[11] = "2222222222";
char str[11] = "helloworld";
char str3[11] = "3333333333";
char str4[11] = "4444444444";
printf("%s %s\n", &str-2,str+2);
return 0;
}