首页 >

指针可以指向什么内存区域呢? – 网络|

被坏人盯上了怎么办,的秒数怎么算的,爱豆 看视频怎么下载被坏人盯上了怎么办,的秒数怎么算的,爱豆 看视频怎么下载指针可以指向什么内存区域呢? - 网络|指针可以指向什么内存区域呢

先看一段代码:

#include<stdio.h>

#include<string>

#include<iostream>

#include<time.h>

usingnamespacestd;

classpeople

{

public:

people();

~people();

stringName;

intage;

boolsex;

charinfo[1024];

voidrun(){}

voideat(){}

private:

};

people::people()

{

}

people::~people()

{

}

intmain()

{

people*p1=newpeople();

cout<<p1<<endl;

cout<<&p1<<endl;

cout<<sizeof(p1)<<endl;

cout<<sizeof(*p1)<<endl;

system(“pause”);

return0;

}

运行看结果:

分析

接下来来一一进行分析:

首先people*p1=newpeople();这一句是类的一个实例化,系统会给people实例化一个对象*p并且给它在堆上开辟空间,注意是在堆上,开辟的空间用来存储对象的数据。数据包括哪些?就是对象的属性和虚函数指针,但是函数并不存储在各对象中。因此run()和eat()方法是不存在对象*p指向的内存处的。

cout<<p1<<endl;输出的是00279360,这是一个地址,是系统给newpeople()对象分配的地址。

cout<<&p1<<endl;输出的是0012FD90,这也是地址,但这是指针变量p本身的地址。

cout<<sizeof(p1)<<endl;

cout<<sizeof(*p1)<<endl;

通过这两个大家就更清晰的认识到了,p1本身只占用4个字节的空间,而他所指向的对象的地址所占的空间就很大,等于类中所有数据类型所占空间之和。

接下来大家在main函数里写一点逻辑:

图解

大家来看一下程序运行时间,指针和内存是怎么工作的。偶画一个图给大家:

程序在运行时,数据主要是存储在栈、堆、代码区、全局区。代码区主要就是存代码中出现的一些字符常量、方法等,比如这里代码中给对象的Name属性赋的值“xiaoli”之类的都是存在此处,然后大家通过new出来的对象,都是由堆通过计算好类中各属性所需空间然后开辟出来的。这里p3不是通过new开辟出来的,所以他是存在栈上的并且地址是固定的,是不能更改的,而p1和p2是能更改的。

改变地址

如此,大家三个对象互相赋值后会发生什么呢?

对比代码和输出结果大家发现了什么?赋值后p1和p2本身的地址并无改变,但是他所指向的内存都编程p3所在的内存了。下面用图解给大家看一下:

注意,此处原来的p1和p2指向的内存由于是new出来的大家需要手动释放它。所以大家在重新赋值之前要将这两块内存删除掉deletep2;deletep1;

改变地址的值

如果偶将代码中的p2=&p3;换成*p2=p3呢?大家看下输出结果:

造成这种情况的原因,其实这就牵涉到指针的两种赋值问题:一种是改变指向的地址,一种是改变本身指向地址的值p2=&p3是改变指向地址,*p2=p3是改变指向地址的值。


指针可以指向什么内存区域呢? - 网络|
  • C语言编程入门指南,让你轻松掌握编程技能 - 网络|
  • C语言编程入门指南,让你轻松掌握编程技能 - 网络| | C语言编程入门指南,让你轻松掌握编程技能 - 网络| ...

    指针可以指向什么内存区域呢? - 网络|
  • 根据输入的关键词c语言,介绍BAT等一线互联网公司运营岗位的招聘要求 - 网络|
  • 根据输入的关键词c语言,介绍BAT等一线互联网公司运营岗位的招聘要求 - 网络| | 根据输入的关键词c语言,介绍BAT等一线互联网公司运营岗位的招聘要求 - 网络| ...

    指针可以指向什么内存区域呢? - 网络|
  • socket c语言(详细浅出socket编程基础) - 网络|
  • socket c语言(详细浅出socket编程基础) - 网络| | socket c语言(详细浅出socket编程基础) - 网络| ...