看題:分析下列C語言代碼,解釋出現(xiàn)結(jié)果的原因!
#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();
}
這是運(yùn)行結(jié)果
解析:
1、int* ptr = (int*)a;這條語句的作用是,把a(bǔ)強(qiáng)轉(zhuǎn)為int型指針,并賦值給ptr。
2、ptr += 2;這條語句的作用是,使ptr指針走兩步,而ptr是int型指針,所以步長(zhǎng)是4字節(jié),走兩步就是8字節(jié)。每個(gè)字母一個(gè)字節(jié),意思就是走過了八個(gè)字符,ptr現(xiàn)在指向了第二個(gè)a字母。You_are_a_girl
3、*ptr = 'abcd';這句話是最難理解的吧,應(yīng)該。*ptr是整數(shù),整數(shù)是四個(gè)字節(jié),看后面的值abcd正好四個(gè),每個(gè)占一個(gè)字節(jié)(大家看看ascii表,看下對(duì)應(yīng)的二進(jìn)制)01100001 01100010 01100011 01100100這就是理論的內(nèi)存存儲(chǔ)的二進(jìn)制數(shù),八個(gè)位(一個(gè)字節(jié))存一個(gè)字母,分別是a,b,c,d
4、經(jīng)過上面的分析,對(duì)于輸出基本沒什么問題,最大的問題就是為什么abcd會(huì)是逆序輸出的。這是因?yàn)閷?duì)于跨越多個(gè)字節(jié)的數(shù)據(jù)類型(比如 int 長(zhǎng) 4 個(gè)字節(jié)),如何在內(nèi)存中對(duì)這些字節(jié)進(jìn)行排序有兩種常見的方法:大端法(Big-endian)和小端法(Little-endian)。具體的就不在這里解釋了,想了解的自行科普
更多學(xué)習(xí)資料,學(xué)習(xí)題目可以加群479478422,還有群主免費(fèi)解答哦