作者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