C两个小例子(数组与指针)
生活随笔
收集整理的這篇文章主要介紹了
C两个小例子(数组与指针)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大端模式
所謂的大端模式,是指數據的高位,保存在內存的低地址中,而數據的低位,保存在內存的高地址中,這樣的存儲模式有點兒類似于把數據當作字符串順序處理:地址由小向大增加,而數據從高位往低位放; 例子: 0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000 0000440: b484 6c4e 004e ed00 0000 0000 0100 0000 在大端模式下,前16位應該這樣讀: e684 記憶方法: 地址的增長順序與值的增長順序相同小端模式
所謂的小端模式,是指數據的高位保存在內存的高地址中,而數 據的低位保存在內存的低地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低,和我們的邏輯方法一致。 例子: 0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000 0000440: b484 6c4e 004e ed00 0000 0000 0100 0000 在小端模式下,前16位應該這樣讀: 84e6 記憶方法: 地址的增長順序與值的增長順序相反大小端模式
為什么會有大小端模式之分呢?這是因為在計算機系統中,我們是以字節為單位的,每個地址單元都對應著一個字節,一個字節為 8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對于位數大于 8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個字節,那么必然存在著一個如何將多個字節安排的問題。因此就導致了大端存儲模式和小端存儲模式。例如一個16bit的short型x,在內存中的地址為0x0010,x的值為0x1122,那么0x11為高字節,0x22為低字節。對于 大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,剛好相反。我們常用的X86結構是小端模式,而KEIL C51則為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬件來選擇是大端模式還是小端模式。下面兩個例子,只有一個是可以正確輸出的。如下:
例一:
#include <stdio.h> #include <stdlib.h> #include <string.h>int main(void) { char a[20];int i;int *p=a;for(i=0;i<20;i++){a[i]=i;printf("a[%d]=%d\n",i,a[i]);}//p++;printf("%d\n",*p);printf("&P=0x%X\n",p);printf("a=0x%X &a=0x%X\n",a,&a);printf("&a[0]=0x%X\n",&a[0]); }重點講一下第一個例子:
首先要知道存儲的大小端問題:
大端模式,是指數據的高位,保存在內存的低地址中,而數據的低位,保存在內存的高地址中
小端模式,是指數據的高位保存在內存的高地址中,而數 據的低位保存在內存的低地址中
int main(void) {//大端模式,是指數據的高位,保存在內存的低地址中,而數據的低位,保存在內存的高地址中//小端模式,是指數據的高位保存在內存的高地址中,而數 據的低位保存在內存的低地址中char x1,x0;int x=0x1122; x0=((char*)&x)[0]; //低地址單元 如果等于0X22就說明是小端模式 如果等于0X11就說明是大端模式 0x11是高位數據 0x22是低位數據x1=((char*)&x)[1]; //高地址單元 printf("x0=%x x1=%x\n",x0,x1);if(0x22==x0){printf("計算機是小端模式\n");}else{printf("計算機是大端模式\n"); } }
最后得出是小端模式,也就 是數據的 低 位數據保存在 低 地址中 (一般情況,就我以前的編程經驗,小端模式的計算機比較多)
好了,現在知道是小端模式了,那么。再看回上面的代碼。
a數組從0~19 依次是a[0]~a[19]的值是0~19.
那么,我p的地址和a的地址是一樣的,p指向a數組的首元素。而且p是指向int類型,a是char類型。那么*p應該是從a[0]到a[3]4個元素。p會取得這四個元素的值。
又因為是小端模式(高位數據在高地址,低位數據在低地址,原來3是在高位數據,肯定回到高位地址,也就是0X30201000)。這四個字節取出來的值應該是:00000011 00000010 00000001 00000000 也就是 3210 轉成int就是:50462976
好了。從上面的例子來看,我很快得出一個想法,看下面的代碼
#include <stdio.h> #include <stdlib.h> #include <string.h>int main(void) { char a[20];char b='0';int i;int *p;p=a;for(i=0;i<20;i++){a[i]=i;printf("a[%d]=%d\n",i,a[i]);}//p++;printf("%X\n",*p);printf("&P=0x%X\n",p);printf("b=%x b=%d\n",b,b);printf("a=0x%X &a=0x%X\n",a,&a);printf("&a[0]=0x%X\n",&a[0]); }例二: #include <stdio.h> #include <stdlib.h> #include <string.h>int main(void) { char a[20];int i;char *p=a;for(i=0;i<20;i++){a[i]=i;printf("a[%d]=%d\n",i,a[i]);}//p++;printf("%d\n",*p);printf("&P=0x%X\n",p);printf("a=0x%X &a=0x%X\n",a,&a);printf("&a[0]=0x%X\n",&a[0]); }
總結
以上是生活随笔為你收集整理的C两个小例子(数组与指针)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Json转换成excel 离线版
- 下一篇: 每日一题(15)—— static有什么