XP系統TC編譯器
關于記憶體尋址的一些總結:
如果申請的是變數i:
變數的尋址;
main()
{
int i;
int j;
int k;
scanf("%d %d",&i,&j);
k = i + j;
k =(int) &i; /* 把&i在記憶體中的虛擬地址強轉成int給K */
printf("&i = %d\n",(int)&i); /* 結果真實資料是D4有符號顯示是-44,記憶體中真實存在的資料是FFD4 */
printf("%d\n",(unsigned char)k); /* 結果真實資料是D4無符號顯示是212,k里面存放的是&i的地址%d = 65492,0x = FFD4 D4的十進制是212 */
printf("%u\n",k);
printf("*(char *) = %d\n",*(char*)k); /* 這個是把K當成一個地址,然后取K地址里面的資料300 012C,取到2C 結果就是44 */
printf("* &(char)k = %d",*& (char)k); /* K里面存放的資料是FFD4,直接取的是D4,無符號顯示為-44 */
}
結果
300 12
&i = -44
212
65492
*(char *) = 44
* &(char)k = -44
結論:
*(char *)i 是把i當成一個地址,然后取這個地址里面資料。
* &(char)i 只是取i里面的char型別的資料。
----------------------------------------------------------------------------------
如果申請的是陣列i:
陣列尋址的表達方式:
main()
{
int i[4];
int j;
scanf("%d %d",i,i+1);
i[2] = i[0] + i[1];
j = (int)(i+2);
printf("*(int *)(i+2) = %d\n",*(int *)(i+2)); /* *(int(或者char) *)(i+2) == *(i+2) == i[2]; 這三個式子等價 */
printf("*(i+2) = %d\n",*(i+2));
printf("i[2] = %d\n",i[2]);
printf("j = %d\n",j);
printf("j = %u\n",j);
}
結果
C:\turboc2>err
140 160
*(int *)(i+2) = 300
*(i+2) = 300
i[2] = 300
j = -40
j = 65496
結論:*(int(或者char) *)(i+2) == *(i+2) == i[2]; 這三個式子等價
陣列地址的表達方式:
main()
{
int i[4];
int j;
scanf("%d %d",i,i+1);
i[2] = i[0] + i[1];
j = (int)(i+2);
printf("(int *)(i+2) = %d\n",(int *)(i+2));
printf("(int)(i+2) = %d\n",(int)(i+2));
printf("i+2 = %d\n",i+2);
printf("j = %d\n",j);
printf("j = %u\n",j);
}
結果
C:\turboc2>err
150 150
(int *)(i+2) = -40
(int)(i+2) = -40
i+2 = -40
j = -40
j = 65496
結論:申請i的陣列i+2是陣列i[2]的地址,(int *)(i+2) == (int)(i+2) == i+2 這三個運算式的意思一樣,都是i[2]的地址;
---------------------------------------------------------------------------------------------------------------
陣列的尋址:
main()
{
int i[4];
scanf("%d",i); /* 在i[0]處輸出300 */
i[2] = (int)(i+0); /* 把i[0]的地址給i[2] */
printf("*(int *)i[2] = %d\n",*(int*)i[2]); /* *(int *)i[2]的資料是300和想的結果一樣 */
printf("i[2] = %d\n",i[2]);
printf("i[2] = %u\n",i[2]);
}
結果
C:\turboc2>err
300
*(int *)i[2] = 300
i[2] = -44
i[2] = 65492
其實和申請單個變數的尋址是一樣的*(int *)i[2],就是把變數i換成了i[2];
留個學習筆記還需要添分的嗎???
uj5u.com熱心網友回復:
筆記寫到博客,論壇是討論問題的uj5u.com熱心網友回復:
不好意思,付訓論壇~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/148845.html
標籤:C語言
上一篇:大神們,寫入位置時發生訪問沖突
下一篇:malloc函式開辟空間的意義
