每日一题 | C语言指针练习 一

看题:分析下列C语言代码,解释出现结果的原因!

#include

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();

}

每日一题 | C语言指针练习 一_第1张图片

这是运行结果

结果

解析:

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,还有群主免费解答哦

你可能感兴趣的:(每日一题 | C语言指针练习 一)