C++ 学习 第七天
今日内容:指针  函数
 

指针:

指针是用于记录一块内存空间地址的
符号& 后面跟的是一个变量的时候,代表的是取址符
符号*   
乘号:需要左右两侧的操作数   
指针符:当*的前方跟的是一个数据类型的 时候  
解引用符:当*后方跟的是指针的时候 int number=20 int* ptr=&number; *ptr;解引用
 

 

无效指针:空指针 野指针

空指针:

是程序员主动触发,再创建一个指针变量后不确定具体指向的时候给出赋值,空指针经常用于判断指针的有效性
null 相当于变量的值为0 
判断指针是否为空(可控)1
判断指针是否为空(可控)2

野指针:

形成的场景:a.程序员给出了无效地址(非常少见的情况) b.未经初始化的指针,不知道具体指向  c.程序员在主动释放内存空间没有回收
a.给出了无效的地址,这个地址是没有对应的内存空间存在的
b.未经初始化的指针
c.程序员在主动释放内存空间没有回收
 
回收地址
空指针可控,野指针不可控
 

指针和数组的关系:

声名数组并赋值:
10的地址:
20的地址:
解引用  10:
解引用 20
 

遍历数组:

数组的名称是指针,不是变量,是一个常量指针
 输出变量值  
数组的名字是数组的首地址(首元素的地址)
 

指针变量的字节数问题:

指正变量是用于记录一个地址的,在内存空间中的占位始终是4字节

结构体指针:

(结构体类型的指针)
以下AddInfo里输出的是小白 而在SelInfo里输出的是空,这是因为Hero heroInstance 是局部变脸 hptr的地址指向了这个局部变脸的地址 当函数调用完成后 局部变量什么周期结束了 释放内存 它原本指向的值就变成了空 所以hPtr调用的值也是空
以下AddInfo1里输出的是小白 在SelInfo1里输出的也是小白 这和上面不同是因为 这个是在堆内存中申请了一个内存空间 因为没有进行delete操作 和回收地址没有释放它的内存,所以它所指向的内存 而hPtr1没有释放所以hPtr1还是指向了这个内存空间 所以值就变成小白了

指针数组:

创建4个指针变量
创建一个容器,存放以上的4个指针
指针数组赋值:
 

函数:

语法:返回函数  函数名(参数列表){函数体}
存在多个默参的时候必须从右向左,中间没有跳跃式赋默参

形参和实参:

int a ,bool b ,string s是形参
以下100 false Hello是实参
实参是一个值  形参是一个变量
声名的时候可以不给形参
声名和定义的参数名称可以不一致,但是必须保证参数的类型一致切顺序一致

默参:

C++允许存在默认参数(默参)
在函数声名和定义拆开的时候默认参数给到声名的位置
调用一个不带默参的函数时,必须得按照形参类型传实参
调用带默参的函数时 
形参不赋值 输出结果是10 
形参赋值 输出结果是形参赋予的那个值
 

指针函数:

这是一个无返回值无蚕食类型的函数指针,并将这个指针初始化为空指针
将test函数地址赋值给ptr 指针函数的作用就是可以将一个函数作为另一个函数的参数进行传递
借助指针调佣指针指向的函数
括号是函数调用符 没有括号调用的是函数的地址
指针的类型不匹配会导致报错
 
以下是ptr1指针,能够指向一个返回值为string.参数为int的函数
以下是ptr2是一个指针,能够指向一个返回值为string.参数为int,string的函数
 

函数指针的使用:

两个参数a. CallBackPtr
实参100传给形参a 函数Addhero的地址传给CallBackptr
posted on 2023-04-18 22:13  枯叶的楪  阅读(15)  评论(0编辑  收藏  举报