找回密码
 立即注册
首页 业界区 安全 C++数组、指针与字符串

C++数组、指针与字符串

怒鼓踊 2025-6-1 18:16:46
1、对象名访问成员:myClock.Settime()   myClock.H (myClock为对象名,myClock称为本次调用的目的对象)
对象指针访问成员:Point→Settime()  Point→H 或者 (Point).Settime (Point).H
2、this指针
①this指针是一个隐含于每一个类的非静态成员函数中的特殊指针,该指针自动指向调用成员函数的当前对象
②每次对成员函数的调用都存在一个目的对象,this指针就是一个指向这个目的对象的指针
③当一个对象调用类的成员函数时,对象的地址被传递给this指针,即this指针指向了该对象
④在成员函数中,可以使用*this来标识正在调用该函数的对象
⑤当局部作用域中声明了与类成员同名的标识符时,对该标识符的直接引用代表的是局部作用域中所声明的标识符。此时,为了访问该类成员,需要使用this指针
1.png

3、数组基础
①二维数组会按照行优先的顺序存储
②int a[3]={1,1,1};与int a[]={1,1,1}两者是完全等价的
③如果给出全部元素的初值,第一维的下标个数可以不用显式说明
int a[2][3]={1,0,0,0,1,0};与int a[][3]={1,0,0,0,1,0},与int a[2][3]={{1,0,0},{0,1,0}}三者完全等价
使用数组名传递参数时,传递的是地址,所以函数内会改变原数组中的值
⑤对象数组
2.png

当对象数组中的元素对象被删除时,系统会调用析构函数来完成扫尾工作
⑥数组名表示数组首元素的首地址
3、内存空间的访问方式
①具有静态生存期的变量在程序开始运行之前就已经被分配了内存空间。
具有动态生存期的变量,是在程序运行时遇到变量声明语句时被分配内存空间的。
4、指针变量的声明
①指针变量用于存放内存单元地址,可以被用来间接访问内存单元
②声明指针的语法形式
3.png

5、*和&
①*用来获取指针所指向的变量的值
②&为取地址符,使用&i可以得到变量i的存储单元地址
4.png


  • &出现在变量声明语句中位于被声明的变量左边时,表示声明的是引用
  • &在给变量赋初值时出现在等号右边时,表示取对象的地址
    5.png

    6、指针的赋值
①一个数组,可以用它的名称来直接表示它的起始地址。数组名称实际上就是一个不能被赋值的指针,即指针常量。
②可以通过指针改变变量的值
③指针的类型

  • 指向常量的指针。此时不能通过指针改变所指对象的值,但指针本身可以改变,可以指向别的对象。该指针也不能改变别的对象的值。
    6.png

  • 指针类型的常量。这时指针本身的值,不能发生改变。【注意const的位置】
    7.png

  • 一般情况下,指针的值只能赋给相同类型的指针。但void类型的指针:任何类型的指针都可以赋给void类型的指针变量。经过使用类型显式转换,通过void类型的指针便可以访问任何类型的数据。
【注】void类型的指针,只能存地址,不能用来存取数据,因为不知道数据类型。
8.png

7、指针运算
①当指针指向连续存储的同类型数据时,指针与整数的加减运算和自增自减运算才有意义。
②指针和指针之间可以做减法运算,不可以做加法运算。
③如果两个相同类型的指针相等,就表示这两个指针是指向同一个地址
④指针变量可以和整数0进行比较,0专用于表示空指针,也就是一个不指向任何有效地址的指针。
9.png

8、用指针处理数组元素
10.png

11.png

12.png

9、指针数组:由指针组成的数组
13.png

①由于指针数组的每个元素都是一个指针,必须先赋值,后引用
10、用指针作为函数参数
11、指针型函数
不要将非静态局部地址用作函数的返回值
错误例子:在子函数中定义局部变量后将其地址返回给主函数,就是非法地址
②非静态局部变量作用域和寿命都仅局限在本函数体内
返回的指针要确保在主调函数中是有效合法的地址
正确例子:在子函数中通过动态内存分配new操作取得的内存地址返回给主函数是合法有效的,但是内存分配和释放不在同一级别,要注意不能忘记释放,避免内存泄漏
12、函数返回数组指针
①不能简单地返回指向局部数组的指针,因为当函数结束时,局部数组将被销毁,指向它的指针将变得无效。为了避免以上情况,使用静态数组或动态分配数组。
②当使用动态分配数组时,调用函数的代码负责释放返回的数组
14.png

15.png

13、指向函数的指针
①每一个函数都有函数名,实际上这个函数名就是表示函数的代码在内存中的起始地址。
②函数指针就是专门用来存放函数代码首地址的变量
③函数指针的声明

17.png

函数指针名=函数名;//初始化函数指针
18.png

14、对象指针
①对象指针的语法
19.png

②通过对象指针 ,可以访问到对象的公有成员
15、指向类的非静态成员的指针
①指向对象成员的指针在使用前要先声明,再赋值,最后引用
②声明指针的语句的一般形式为:
20.png

声明了指向成员的指针之后,需要对其进行赋值,也就是要确定指向类的哪一个成员。对数据成员指针赋值的一般语法形式为:
21.png

【注】对类成员取地址时,也要遵守访问权限的约定,也就是说,在一个类的作用域之外不能对它的私有成员取地址
③通过指向类的非静态成员的指针访问类的数据成员的方法:
22.png

④通过指向类的非静态成员的指针访问类的函数成员的方法:
23.png

【注】定义的指针是指向类的,具体使用时,要通过具体对象进行使用
16、指向类的静态成员的指针
①对类的静态成员的访问是不依赖于对象的,因此可以用普通指针来指向和访问静态成员。
17、动态内存分配
①new:动态分配内存/动态创建堆对象,语法形式如下:
24.png

【注】如果内存申请成功,new运算便返回一个指向新分配内存首地址的类型的指针,可以通过这个指针对堆对象进行访问;如果申请失败,会抛出异常
25.png

【注1】在用new建立一个类的对象时,如果该类存在用户定义的默认构造函数,则new T和new T()这两种写法是相同的,都会调用默认构造函数。
26.png

②delete:删数由new建立的对象,释放指针所指向的内存空间
格式为:delete 指针名;
【注1】如果被删除的是对象,该对象的析构函数将被调用。对于用new建立的对象,只能使用delete进行一次删除操作,如果对同一内存空间多次使用delete进行删除将会导致运行错误。
【注2】用new分配的内存,必须用delete加以释放,否则会导致内存泄漏。
27.png

③new动态创建一维数组
28.png

用new动态创建一维数组时,在方括号后面仍然可以加小括号,但括号内不能带任何参数。不加(),与new T初始化一样。加(),与new T()初始化一样。
29.png

④由于assert只在调试模式下生效,一般只用assert来检查程序本身的逻辑错误。
30.png

18、字符串
31.png

①如果希望从键盘读入字符串,直到行末为止,不以中间的空格作为输入的分隔符,可以使用头文件string中定义的getline.
32.png

19、数组指针和指向数组的指针
p首先是一个指针,其次才指向一个数组,这就是数组指针,指向数组的指针
33.png

指针数组,p首先是一个数组,其次才是一个指针。
【注】方括号的优先级比*的优先级高,所以就算不带括号,也先是数组,其次才是指针
34.png

函数指针,只需要将函数名那边改成指针,就变成了函数指针。
35.png

20、双重地址
36.png

pa是地址,ppa是地址的地址。
21、
37.png

38.png


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册