精華區beta NCTU-STAT98G 關於我們 聯絡資訊
#include <stdio.h> #include <stdlib.h> #include <math.h> int main() { int z[3] = {10,20,30}; int *pt1, *pt2, *pt3; pt1 = &z[0]; pt2 = &z[1]; pt3 = &z[2]; printf ("pt1.add = %x, pt1.value = %d\n",pt1,*pt1); /* 宣告*pt1為指標變數後, 將其記憶體位址指向&z[0], 此時pt1代表記憶體位址, *pt1代表其記憶體位址上的值 以下同pt2, pt3 */ printf ("pt2.add = %x, pt2.value = %d \n",pt2, *pt2); printf ("pt3.add = %x, pt3.value = %d \n",pt3, *pt3); printf("*pt3-*pt1 = %d\n",*pt3-*pt1);//a printf("pt3-pt1 = %x (int)\n",pt3-pt1);//b /* a行 顯示*pt1,*pt2,*pt3為值, 可以直接使用*pt1,*pt2,*pt3的直做數學運算 b行 顯示 pt1, pt2, pt3為記憶體位址, 記憶體位址可以相減 相減顯示結果為兩個位址之間的間隔(以宣告形態int為單位) PS 1: 記憶體相減, 只能顯示大減小, 小減大則無法顯示 PS 2: 記憶體相減, 只能同資料形態的兩個變數相減, 不同資料形態的位址相減,則在compile時會產生error. */ float w,x,y; printf("w.add = %x\n",&w); printf("x.add = %x\n",&x); printf("y.add = %x\n",&y); /* 以上可以發現, 記憶體位址的配置是依宣告順序遞減 所以w的位址最大, y的位址最小 而如int z[3]={10,20,30}的宣告方式則不同: 系統會先給z[3]一組3*4(int) bytes的記憶體空間, 再分別將z[0],z[1],z[2]由小到大配置 */ printf("&y-&w = %x\n",&y-&w);//a printf("&w-&y = %x (float)\n",&w-&y);//b /* a行顯示出一行無法理解的文字, 是因為&y的位址較小, 小減大無法顯示 b行則顯示值為2, 也就是兩者間隔2 float的距離 */ //printf("pt1-&y = %x\n", pt1-y); /* 執行上述命令, 則會出現一error, 錯誤原因在於宣告的變數形態不同造成 */ return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.7.248