作者markoo (上行下笑阿..)
看板NCTU-STAT98G
標題0721 統算 section 3.cpp
時間Tue Jul 21 12:40:10 2009
#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