C語言的指標型別
阿新 • • 發佈:2018-12-16
目錄
1 指標型別的大小
2 指標型別的作用
正文
指標型別
1. 指標型別的大小
在32位機器上,地址是32個0或1組成的二進位制序列,如果每個位元位都給一個地址位,則32為機能編址的範圍只為512MB,若以4位元組編址,32位機則可以編址4GB。
在64位機器上,有64根地址線,則一個指標變數的大小是8位元組。
對於以下程式碼:
int main(int argc, const char * argv[]) { printf("char* : %lu\n",sizeof(char*)); printf("short* : %lu\n",sizeof(short*)); printf("int* : %lu\n",sizeof(int*)); printf("float* : %lu\n",sizeof(float*)); printf("double* : %lu\n",sizeof(double*)); printf("long double* : %lu\n",sizeof(long double*)); return 0; }
- 在64位機下的輸出為:
- 在32位機下的輸出為:
問題來了:
為什麼不同型別的指標大小都是一樣的呢?為什麼要這麼設計?
2. 指標型別的作用
- 指標型別決定了對指標解引用的時候有多大的許可權(能操作幾個位元組)。比如:
char*
的指標解引用只能訪問一個位元組,而int*
的指標解引用就能訪問四個位元組。
看下面的這段程式碼:
int main(int argc, const char * argv[]) { int i = 0x11223344; int *pi = &i; *pi = 0; int c = 0x11223344; char *pc = &c; *pc = 0; return 0; }
Debug看記憶體變化:
發現:
i=0x11223344
在執行*pi=0;
後全部變為了0
c=0x11223344
在執行*pc=0;
後只有高位變成了0
說明:int*型別的指標解引用後,操作許可權是4個位元組(int的大小)。
char*解引用後,操作許可權僅為一個位元組。
驗證了:指標型別決定了對指標解引用的時候有多大的許可權(能操作幾個位元組)。
問題又來了:
為什麼高位的44變為0了呢?
這和資料在記憶體中儲存的模式有關。大小端模式
大端模式,是指資料的高位元組儲存在記憶體的低地址中,而資料的低位元組儲存在記憶體的高地址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:地址由小向大增加,而資料從高位往低位放;這和我們的閱讀習慣一致。
小端模式,是指資料的高位元組儲存在記憶體的高地址中,而資料的低位元組儲存在記憶體的低地址中,這種儲存模式將地址的高低和資料位權有效地結合起來,高地址部分權值高,低地址部分權值低。
- 指標型別決定了指標指向前或者向後一步有多大距離。
對於以下程式碼:
int main(int argc, const char * argv[])
{
int n = 10;
int *pi = &n;
char *pc = (char*)&n;
printf("&n : %p\n", &n);
printf("pi : %p\n", pi);
printf("pi+1 : %p\n", pi+1);
printf("-----------------------\n");
printf("pc : %p\n", pc);
printf("pc+1 : %p\n", pc+1);
return 0;
}
有在64位機下有如下輸出:
可以看到:
pi=pc=&n
但是:
pi+1
和 pc+1
不同
pi+1 - pi
= 8
pc+1 - pc
= 1
驗證了:指標型別決定了指標指向前或者向後一步有多大距離。