学习笔记:c++基础之指针与引用

一、 指针

1. 什么是指针

指针其实就是一个变量,不过它的值是一个内存地址 , 这个地址可以是变量或者一个函数的地址

当你声明明一个变量的时候,计算机会将指定的一块内存空间和变量名进行绑定;这个定义很简单,但其实很抽象,例如:int x = 5; 这是一句最简单的变量赋值语句了, 我们常说“x等于5”,其实这种说法是错误的,x仅仅是变量的一个名字而已,它本身不等于任何值的。这条statement的正确翻译应该是:“将5赋值于名字叫做x的内存空间”,其本质是将值5赋值到一块内存空间,而这个内存空间名叫做x。切记:x只是简单的一个别名而已,x不等于任何值。

  • 为什么需要指针?

不就是使用变量或者调用函数吗?难道不能直接调用吗?那么需要指针做什么呢?

实际上是可以的,但是并不是所有的情况都可以。比如:
1. 在内部函数中,可以使用指针访问外部函数中定义的某个变量x, 因为它并不是声明在自己的函数范围内。
2. 指针在处理函数传递数组的时候非常高效
3. 我们还可以在堆中申请一块动态内存,这块内存甚至没有一个变量名称,唯一的访问方式是通过指针。
4. 可以使用你指针访问指定的内存地址(游戏修改器)

2. 声明和访问指针

  • 声明指针
  1. 声明指针的时候要记得初始化,如果没有初始化,指针存放的将会是垃圾数据(因为你根本不知道它指向何方)
  2. 可以使用nullptr(c++11)进行指针初始化,初始化存放的值是 0
变量类型  *指针名称;

int * int_ptr;
double * double_ptr;
char * char_ptr;
string * strng_ptr;

  • 初始化指针

指针的指向是一个块内存地址,如果仅仅是声明而未初始化,那么指针的指向无法得到保证,如果没有明确、指针的指向,那么最好把它初始化成一个空指针,也就是表示目前没有指向,空指针的值是0

//初始化指针
int a = 3 ;
int *p0 = &a; //p0是一个指针,指向的是一个int类型的数据,这个数据是3.

//空指针
int *p1 = nullptr;
int *p2 = NULL;
int *p3 = 0 ;


  • 指针地址和大小

指针实际上也是一个变量,也会有自己的内存空间,也会有自己的长度大小。获取指针的内存地址,依然使用取地址符 & , 长度大小依然使用sizeof 来获取

int age = 88;
int *p = &age;

cout << "指针的地址是: " << &p <<endl;
cout << "指针存储的是: " << p <<endl;
cout << "指针指向的数据是: " << *p <<endl;
cout << "指针大小是: " << sizeof p <<endl;
cout << "age的大小是: " << sizeof age <<endl;

int和long类型数据大小并非由硬件平台的位数决定,而是由C标准和编译器共同决定。
同时,指针即sizeof(ptr)的大小也并非由硬件平台的位数决定,而是由实际上所使用的地址总线宽度决定的。

3. 指针dereference( 解引用)

所谓的指针dereference就是,前面说过指针就是一个变量,存放的是一个地址。这个地址有可能是变量 a 或者是变量b的地址。有了这个地址,我们可以通过dereference操作符 * 去获取到a对应的值或者b对应的值。

int main(){

int score {100};

int *score_ptr{&score};

cout << *score_ptr << endl; // 100

*score_ptr = 200 ;
cout << *score_ptr << endl;  //200
cout << score << endl;  // 200

//-------------------------------------
double high_price{6999};
double low_price{1999};

double *temp_ptr = &high_price;

cout << *temp_ptr << endl; // 6999
temp_ptr = &low_price ;
cout << *temp_ptr << endl; // 1999

//-------------------------------------
//处理可以使用指针修改数据之外,也可以直接对变量进行修改

string name{"张三"};

string * string_ptr{&name};
cout << *string_ptr << endl; //张三

name = "李四" ;
    cout << *string_ptr << endl; //李四
}

4. 动态内存分配

在进行编码的时候,我们根本不知道需要多少内存空间。举个例子,比如我们需要存储学生的数据,这时候可以使用数组来存储,那么就必须知道学生的具体人数。如果不知道,就无法使用数组了。例如vector就是使用动态内存。但是有时候,我们如果需要存放的是一单个对象数据,并不是一堆数据。用vector就有点浪费了。

为了解决上述问题,C++ 提供了一种“动态内存分配”机制,使得程序可以在运行期间,根据实际需要,要求操作系统临时分配一片内存空间用于存放数据。此种内存分配是在程序运行中进行的,而不是在编译时就确定的,因此称为“动态内存分配”。申请动态内存

  • 申请内存
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值