所有栏目 | 云社区 美国云服务器[国内云主机商]
你的位置:首页 > 云社区 » 正文

C语言指针怎样快速掌握?指针用处大吗?

发布时间:2020-04-12 09:06:59

资讯分类:指针  c语言  用处  快速  内存  指针  的是
C语言指针怎样快速掌握?指针用处大吗?

指针就是内存地址。

要注意区分指针变量和指针这两个概念。

变量是高级语言中内存地址的名字,在编译的时候确定。变量的类型就是内存对应地址中存储的数据类型。指针变量就是变量名对应内存地址中存储的是一个内存地址。

具体举例:

int *a; //变量a(指针变量)对应的内存地址中存放的是一个内存地址(一个指针),而这个地址中存放的是一个int数据

int **b;//变量b对应的内存中存放的是一个内存地址x(一个指针),x指向的内存中存放的也是一个内存地址y(一个指针),y指向的内存中存放的是一个int类型的数据。b也就是所谓的二级指针变量。

C语言指针怎样快速掌握?指针用处大吗?

C语言指针就是这门语言的灵魂,说难学,那肯定是有难度的,毕竟这是业界公认的。但是如果你熟练掌握了指针的话,它又将会成为你手中的一柄利器。下面就详细的分享一下指针该如何深入的去理解它以及如何熟练的应用它

理解指针

首先,你需要掌握两个运算符“*”和“&”;

“&”运算符:取对象在内存中的地址

“*”运算符:取内存中地址上的对象(值);

大家一定要深刻的理解上面两个运算符,然后才能去进一步理解指针;

int a = 100 ;这一行代码我想大家都没问题。那么“&a”返回的就是对象(变量)a在内存中的地址,它是一个16进制数。

然后用“*”号去a的地址去取对象:“*(&a)”,,就能取到对象a,也就就是100 ;

接下来进入重点了,指针,本身也是一个变量(对象),它本身占用内存,但是它只存地址(别人的地址),它存的谁的地址我们就称它为指向谁的指针;

int* p = &a ;int* p_2 = new int(200) ;先不管他的类型申明,只看变量本身p和p_2。前面讲到指针存放的是对象的地址,那么可以理解为指针是一个地址变量,那么赋值的话就需要也赋一个地址给它一个地址。int* 和char*都可以表示地址类型,它们的区别就是地址所存的值得类型不同,一个是存整型,一个是存字符型;

对指针取值的话,就是用“*”号,后面接对象地址,也就是指针变量,所以*p和*p_2就分别是a和200;

指针的运用

指针并不是C/C++独有的,像C#和java等其实也是有指针的,只不过都被语言本身用其他的方式替代和封装了一般程序员接触不到,C/C++就不一样,它是直接将指针暴露给开发者,因为大部分牵涉到指针的都与内存有关,而计算机内存很重要,万一出什么问题可能系统都会崩溃,下面就简单来看一下程序在运行时指针与内存之间到底是个什么样的关系:

先看一段代码:

#include <stdio.h>

#include <string>

#include <iostream>

#include <time.h>

using namespace std;

class people

{

public:

people();

~people();

string Name ;

int age ;

bool sex ;

char info[1024] ;

void run(){}

void eat(){}

private:

};

people::people()

{

}

people::~people()

{

}

int main()

{

people* p1 = new people();

cout<<p1<<endl;

cout<<&p1<<endl;

cout<<sizeof(p1)<<endl;

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

system("pause");

return 0 ;

}

直接运行看结果:

分析

接下来来一一进行分析:

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

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

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出来的我们需要手动释放它。所以我们在重新赋值之前要将这两块内存删除掉delete p2 ;delete p1;

改变地址的值

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

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

C语言指针怎样快速掌握?指针用处大吗?

要花钱,把这四本书看完。





C语言指针怎样快速掌握?指针用处大吗?

指针即存储数据的内存地址。牢记这一点理解指针就很容易了。

C语言指针怎样快速掌握?指针用处大吗?

所谓指针就是地址,用c语言,指针是绕不过的概念,必须掌握。

指针没那么难,其实理解后简单到爆。每个数据都有一个值,和保存这个值的地址。就像一排房间放了各种东西,房间里放的东西就是值,房号就是地址。知道了房号(地址),就可以取出这个房间(地址)的东西(值),也可以增减这个房间(地址)的东西(值)。

C语言指针怎样快速掌握?指针用处大吗?

有用,因为很多数据需要动态获取,静态是无法获取的,而我们常开辟的数据内存是在栈上,无法动态获取数据,因此需要指针动态开辟内存处理数据,你可以学习csharp和JAVA,没有指针,加油

C语言指针怎样快速掌握?指针用处大吗?

一个不懂C语言的人的问题!在这里解释与不解释都一样。懂的人不需要解释,不懂的人看了这里解释依然不懂。

留言与评论(共有 0 条评论)
   
验证码:
Top