變量:是一個標識符(identifier),用來指代一塊內存區域,使用變量使我們操作內存以區域(area),以塊(block)為單位,提高了方便性。變量是內存區域的別名,機器代碼中,是不會出現變量名的;變量名是給我們程序員操作內存來使用的,機器碼中將變量名替換成了相應的內存地址。
當我們定義int a時,編譯器負責為程序預留4字節空間,并把我們的變量名“a”保存進符號表,并用這個符號表的索引對應實際的空間。如果下面出現b = a;那么它就會根據符號表找到變量的真正的物理位置,取得它的值,賦給b。變量名雖然不直接表示地址,但可用取地址符號&來獲得它所代表的變量的存放地址。因為在定義變量的同時會分配給它相應的空間。 使用變量來對數據的訪問是直接訪問。
a為數組名,表示數組的首地址,在計算數組中元素的值就是通過這個首地址+數據類型*偏移值而得到的。a=&a[0],因此,a是常量,不能進行a++。
在array+1過程中,偏移后的地址為array+sizeof(array)*1;而parray=(int )(&array+1),偏移后的地址為array+sizeof(*&array)*1。 array與&array的值是一樣的,都是該數組的首地址,但他們的含義是不一。 array表示該數組的首地址,及首元素的地址;而&array指向整個數組的內存塊,每次+1時,array偏移一個類型大小,而&array偏移整個數組的內存塊大小,。指針變量存儲的是變量的地址,通過指針變量是對數據的間接訪問。
main.c extern char str[]; int main(void) { printf("%s/n",str); return 0; }test.c int *str="guidao/n";extern char str[]欺騙了編譯器,將指針類型的str當成了數組類型來進行解析,輸出的是一個錯誤的字符串,那這個錯誤的字符串是怎么得到的。由于欺騙了編譯器,將str當成了數組,但是str是一個指針,保存了”guidao/n”這個字符串在常量區的首地址,假如地址為0x01880000,使用printf(“%s/n”,str)時,由于編譯器將str當成了數組,直接將地址0x01880000解析輸出出來,因此我們看到了錯誤的值,如果想正確輸出,則可以強制轉化,改為:
printf("%s/n",(char *)(*(unsigned int *)str));數組是直接訪問,而指針是間接訪問。
int array[5] = {1,2,3,4,5};array[3]讀取數值時,通過array + 3*sizeof(*array)來得到地址,從而得到值,而使用:int *parray = array +3;可以直接得到偏移量,使用指針速度會更快。
int array[5] = {1,2,3,4,5};int *parray = array +3;array[3]=10;*paray = 10;匯編代碼
array[3] = 10;00DB1411 mov eax,4 00DB1416 imul ecx,eax,3 00DB1419 mov dWord ptr array[ecx],0Ah *parray = 10;00DB1421 mov eax,dword ptr [parray] 00DB1424 mov dword ptr [eax],0Ah使用指針匯編代碼更優化。
char str1[5]={'a','b','c','d','f'};char *str2="guidao/n";str1可讀不可寫,*str1可讀可寫,相當于char *const str1; str2可讀可寫,*str2可讀不可寫,相當于const char *str2
新聞熱點
疑難解答