国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

數組與指針

2019-11-08 19:46:46
字體:
來源:轉載
供稿:網友

數組與指針

一、變量

變量:是一個標識符(identifier),用來指代一塊內存區域,使用變量使我們操作內存以區域(area),以塊(block)為單位,提高了方便性。變量是內存區域的別名,機器代碼中,是不會出現變量名的;變量名是給我們程序員操作內存來使用的,機器碼中將變量名替換成了相應的內存地址。

當我們定義int a時,編譯器負責為程序預留4字節空間,并把我們的變量名“a”保存進符號表,并用這個符號表的索引對應實際的空間。如果下面出現b = a;那么它就會根據符號表找到變量的真正的物理位置,取得它的值,賦給b。變量名雖然不直接表示地址,但可用取地址符號&來獲得它所代表的變量的存放地址。因為在定義變量的同時會分配給它相應的空間。 使用變量來對數據的訪問是直接訪問。

二、數組

int array[5] = {1,2,3,4,5};

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偏移整個數組的內存塊大小,。

三、指針

int a=5; int *p = &a;

指針變量存儲的是變量的地址,通過指針變量是對數據的間接訪問。

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 d
Word 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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阿克陶县| 临洮县| 罗江县| 林西县| 宁化县| 石门县| 泰来县| 张家港市| 建阳市| 社会| 乾安县| 武穴市| 肇东市| 思茅市| 彭阳县| 农安县| 烟台市| 工布江达县| 库伦旗| 会宁县| 页游| 徐闻县| 宁河县| 桐城市| 肥东县| 新竹市| 响水县| 滁州市| 盐津县| 黄骅市| 新沂市| 垦利县| 东莞市| 湟中县| 新疆| 登封市| 绥化市| 紫金县| 台山市| 商丘市| 剑川县|