看题:分析下列C语言代码,解释出现结果的原因!
#include<stdio.h>
int main()
{
char a[20] = { "You_are_a_girl" };
printf("%s\n", a);
int* ptr = (int*)a;
ptr += 2;
*ptr = 'abcd';
for (int i = 0; i < 20; i++)
{
printf("%c", a[i]);
}
getchar();
}
这是运行结果
解析:
1、int* ptr = (int*)a;这条语句的作用是,把a强转为int型指针,并赋值给ptr。
2、ptr += 2;这条语句的作用是,使ptr指针走两步,而ptr是int型指针,所以步长是4字节,走两步就是8字节。每个字母一个字节,意思就是走过了八个字符,ptr现在指向了第二个a字母。You_are_a_girl
3、*ptr = 'abcd';这句话是最难理解的吧,应该。*ptr是整数,整数是四个字节,看后面的值abcd正好四个,每个占一个字节(大家看看ascii表,看下对应的二进制)01100001 01100010 01100011 01100100这就是理论的内存存储的二进制数,八个位(一个字节)存一个字母,分别是a,b,c,d
4、经过上面的分析,对于输出基本没什么问题,最大的问题就是为什么abcd会是逆序输出的。这是因为对于跨越多个字节的数据类型(比如 int 长 4 个字节),如何在内存中对这些字节进行排序有两种常见的方法:大端法(Big-endian)和小端法(Little-endian)。具体的就不在这里解释了,想了解的自行科普
更多学习资料,学习题目可以加群479478422,还有群主免费解答哦