百科狗-知识改变命运!
--

指针和地址的区别是什么?

泡在奶味里11个月前 (12-06)阅读数 9#综合百科
文章标签变量指针

区别:

指针和地址的区别是什么?

以下面的情况说明:

1、int a = 5;

int* p = &a;

结论:

*p 是指针变量p指向的变量a的存储内容,*p = 5;

p 是指针变量的存储内容,因为p指向a,所以p的存储内容(存储空间的值)就是系统为变量a分配的存储地址;

2、分析:

int a = 5;

int* p = &a;

int* q = p;

3、说明

1)上面的程序中首先声明了一个int类型的变量a,初始化为5;这个过程为:

2)在初始化时,存储空间存储的是int型的值5,存储地址是由系统自动分配的,同理要声明一个指向a的指针,在初始化的时候赋值给指针变量的值应该是变量a的存储地址,故而有 int* p = &a;

4、在下面的程序中:

int arr[] = { 1, 2, 5, 7 };

int* parr = arr;

同理,要是声明另外一个int类型的指针变量q:

1)int* q = p;

声明了一个int类型的指针变量,并将指针变量p的值赋予q,同样是变量,a = 5,5是变量a的存储空间的值,那么p=?,p等于p存储空间的那个值,即p=#ffa1(a的存储地址);

现在将这个值赋给了指针变量q,正如a初始化的过程一样,int a=5的过程,是将5存储在了int类型变量的存储空间之中,初始化指针变量q时,也是将等号右边的值存储在q的存储空间之中,上边的操作的结果如下:

使得指针变量q指向了变量a。

5、说明

从上面的操作可以看出,&p代表的是指针变量p的存储地址。

int* q = *p;

声明了一个指针变量q,并对其初始化,这一过程的操作如下:

为指针变量q初始化,q的存储空间中存储的值为5.

说明

1、从上面的操作可以看出,是将*p的值赋给了q,p指向变量a,p=#ffa1,而*p的过程就是获得p地址处的存储空间的值,即*(#ffa1)=5,也就是将5赋给了指针变量q,q的存储空间存储的是5;

2、指针变量是指向某一变量的变量,在其存储空间中存储的一般是其他变量的存储地址,上面的初始化过程int* q = *p;是非常危险的,有可能造成程序奔溃。

简单来说,指针是一栋大楼的门牌号码,它的对象是这栋大楼。

程序说明,主要是为程序中用到的变量开内存单元。

程序开头的指针说明干什么呢,也是开内存单元,为的是放门牌号码。无论楼大楼小那怕是一间屋,它的指针,也就是门牌号码,都一般大,只占一个内存单元。

如果程序中要用到钉了某门牌号的大楼的房间怎么办呢?

你要另给大楼分配内存才行。否则你只有门牌,没有楼。

例如:

char

*buff;

--

buff是存放字符大楼门牌的单元

buff

=

(char

*)

malloc(32*sizeof(char));

--

给钉了门牌号“buff“的大楼,建造32个放间,每个房间大小是一个字符。

程序中有时不用malloc来给指针分配对象,而用另一种方法,让指针有个对象(或对象有个指针),例如:

float

*p;

--

p是存放浮点大楼门牌的单元

float

a[100];

--

浮点大楼

a[9]

=

9.0;

p

=

&a[0];

printf("%f\n",p[9]);

上面的p

=

&a[0];

&a[0]算出浮点大楼的门牌号,把门牌号码放到存放门牌号码的单元p.

以后用p去找浮点大楼的放间。

C语言中的指针与对象常令人混淆不清,但为什么要弄出个指针呢?这是为了加快运算寻址速度,提高程序效率。

内容声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。部分内容参考包括:(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供参考使用,不准确地方联系删除处理!本站为非盈利性质站点,本着为中国教育事业出一份力,发布内容不收取任何费用也不接任何广告!)