#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;
}