地址只是一个数值,或者叫号码,
指针才是变量,实际上指针的值就是地址
和地址不同的是,指针的值除了值是地址值他还拥有类型信息。
指针可以是常量,亦可以是变量,地址都是常量(是一个数值)
函数调用时,形参是指针的,可以传入一个地址(要类型相同或兼容)。
指针赋值时,可以赋给它一个地址,变量地址(&变量名),数组首地址(数组名)
地址不可以赋值,指针变量可以,就是说指针的值可以变化,地址只能存取其中的值。
指针除了可以像地址那样改变指针的值所代表地址中的值之外。
还可以改变自己的值,也就是换个地址,指向一个新地址。
通常指针的值只是些变量的地址,或者是数组的首地址
另外函数指针的值是函数的地址(可以调用函数)
如
int a[20], x=0;
int *p=a,*q=&x;
a 是整型数组名,值是这个整型数组的首地址,同时是这个整型数组元素变量a[0]的地址。
&a[0]就是a 的值,&a[1] 就是a+1
x 整型变量,值为0,没初始化,也没赋值时不确定,这个是初始化了的值为0
每一个变量都有一个地址,x的地址是&x
地址只是个整数,指针是有类型的地址,由于我们几乎不用 0X40000这样的地址常数(整数)
而是用 &x,&a[0],a这样的数组名以及变量名前面加&这个取址运算符,实际上获得的是拥有类型信息的地址,也就是常量指针
而真正的地址是诸如0X40000这样的整型常数;
所以有时会不太明白指针和地址的区别!
真正使用地址的时候少,通常都是和指针一起用的.
和表示地址的整数不同,指针的加减运算,整数加减的结果不同
p=a;p++;p=&a[1]了,也就是p=a+1了;p地址值加了一个整型变量的长度
假设p 的值为0X200,整型长度为4,p 的值为0X204了。
p=a;p++; p 的值从0X200变成0X204了。
p=a;p+=1; p 的值从0X200变成0X204了。
p=a;p=p+1; p 的值从0X200变成0X204了。
指针相减p-a =1;
地址相减(就是整数相减)0X204-0X200=4 整型变量的长度
x=0;x=x+1;变量x的值x=1了。
x=0;x+=1;变量x的值x=1了。
x=0;x++;变量x的值x=1了。
另外指针除了值外,他自己也有地址
因为他是一个变量,或者是一个命名的常量
不是一个像 123456 这样的数值常量
enum 常量和 宏定义常量是数值常量,很多时候并没有地址。
而指针无论是变量,还是常量,只要有个名字,都会安排有一个地址的。
所以除了定义时 多用了*号,指针其他时候是和有名字的普通变量常量一样的。
指针比普通变量常量多了一个功能,可以存取,所指对象的值(即指针值所代表地址中的值)
如此而已!
PS:
在Dos 时代
字符直接写屏
地址是0xB000:0000
图形直接写屏地址是0xA000:0000
所以会出现
char far *p=(char far*)=0xA0000000;这样的写法;
0xA0000000是显存的地址
char far *p远指针(32位值用整数表示)
温馨提示:答案为网友推荐,仅供参考