数组:将同一数据类型的数据按一定形式有序地组织起来,有序数据的集合就称为数组。声明: 数据类型 数组名[常量表达式]
数组赋值方式:单一数组元素赋值、聚合赋值(数组声明的时候)
字符串处理函数:引用头文件“string”,strcat函数(拼接)、strcpy函数(复制)、strcmp函数(比较)、strlen函数(长度,不含字符串结束符'\0')、
指针:可理解为地址,通过指针能找到内存单元。专门用来存放另一个变量的地址就是指针变量。定义指针变量时必须指定一个数据类型。指针变量的数据类型用来指定该指针变量所指向数据的类型。声明: 数据类型表示符 *指针变量名
指针赋值:可以在声明的时候赋值,也可以在后期赋值。对指针做运算等于对地址做运算。
指针常量与指向常量的指针:(eg指针常量:int *const p,指向常量的指针:int const* p)。将关键字const放在标识符前,表示这个指针是常量,不能改变其指向。若将关键字const放到*的前面,表示这个指针是指向常量,不能通过指针改变其指向的内容。指针常量,不能改变其指向地址(指针的值),能改变其指向的内容;指向常量的指针,能改变其指向地址(指针的值),不能通过该指针改变其指向的内容;
数组指针:是一个指向数组的指针,eg:int (*a)[4]
指针数组:是一个存放指针的数组,eg:int *a[4]
值传递:实参传递进函数体后,生成的是实参的副本,在函数内改变副本的值并不影响实参。
指针传递:指针变脸产生副本,但副本和原变量所指向的内存地址是同一个。
指向函数的指针:函数指针与指针函数,函数指针是指向函数入口地址的指针;指针函数是返回指针类型的函数。
空指针调用函数:空类型指针指向任意类型函数或则将任意类型的函数指针赋值给空类型指针都是合法的,使用空指针调用自身所指向的函数,需要强制类型转换。
栈:在栈中的变量所属的内存大小是无法被改变的,变量的产生与消亡与作用域和存储方式有关。
堆:与栈相对应,堆是一种动态分配方式的内存。当申请使用动态分配方式去存储某个变量时,这个变量会被放入堆中。故在堆中的变量的内存大小可以发生改变,内存的申请和销毁的时机由程序员来设定。
动态分配方式:关键字new和delete。new返回新分配的内存单元的地址,程序自动交给指针一块堆内存。而未经过动态分配的指针则时获取了栈中的内存地址,属于静态分配。申请一块堆内存后,系统不会在程序执行时依据情况自动销毁它,若想释放该内存空间,则需要使用delete关键字。
内存安全问题:1.指针所指向的内存被销毁或被回收后,该区域不可再用,若有指针指向该区域会造成不可预料的错误;2.内存泄漏。申请动态分配内存后,没有使用delete关键字将该内存释放。没有指针指向一块没被回收的堆内存时。
引用:实际上是一种隐式指针,它为对象建立一个别名。eg: int a=10;int &ia=a;ia=2; 那么a=2。
引用传递:如果函数按引用方式传递,在调用函数中修改了参数的值,其改变会影响到实际参数。通过指针传递参数和使用引用传递参数一样,都可以减小值传递带来的开销。
其他概念:一维数组、二维数组、字符数组、指针运算符*、取地址运算符&、空指针(可强制转换为所对应数据类型)、字符数组、回调函数(含函数指针参数的函数)、单级间址、二级间址、左值引用、右值引用、引用传递
Tips:1. 数组元素的下标起始值为0而不是1;
2.定义数组时,其下标不能是变量,因为数组的大小不能动态定义;
3.聚合赋值只能在数组声明的时候;
4.数组元素是左值,而数组名不是可变(被赋值)的左值;
5.二维数组传参时第二维必须指明大小
6.空字符(ascii:0,‘\0’)与空格字符(ascii:32)不一样。一般,空字符作为字符串的结束标志;
7.字符数组在初始化未指明大小进行聚合赋值时,字符串默认后面加‘\0’;指明大小时进行赋值时,数组大小不能大于字符串长度加1(来自与‘\0’);
8.在程序代码中通过变量名来对内存单元进行存取操作,但是代码经过编译后已经将变量名转换为该变量在内存中的存放地址,对变量值的存取都是通过地址进行的;
9.通过变量名访问一个变量是直接的,而通过指针访问一个变量时间接的;
10.指针变量不可以直接赋值;eg: int *p;p=100/错误;;p=a//正确 。。。但能给指针直接赋值0,代表指向为空,和赋值为NULL一个意思。
11.*p不能当变量使用;p要先赋予地址后,才能通过*p来改变其地址所指向的内容;
12.p++(p为指针变量)是加上指针数据类型所占的字节宽度;
13.空值NULL无法用输出语句表示,而且赋空的指针无法被使用,直到被赋予其值。
14.指针可通过数组首元素的地址获取,也可通过数组名来获取;
15.数组名可看作是指针常量;在数组声明后,C++分配给数组一个指针,始终指向数组的第一个元素;
16.对数组名做取地址运算,输出的值和数组名的值一样,但含义不一样。eg:int a[3]={1,2,3}; a与&a输出的值一样,但含义不同
17.指针变量也可以指向一个函数
19.当函数被重载时,不能直接将函数名赋给空类型指针,编译器无法确定将哪个重载函数交给空类型指针。
20.返回指针类型的函数,返回的指针类型的内容并不随返回的地址一样经过复制成功临时变量。解决方法
21.当由好几个指针指向堆内存时,一旦有一个指针释放该堆内存后,系统就将该堆内存收回,尽管还有其他指针指向该堆内存,回收后的堆内存不能再使用,否则会发生预料不到的错误;
22.指针指向的堆内存被回收后,紧接着一般将该指针指向NULL;
23.指针只能访问内存,不能访问寄存器,所以指针访问不到寄存器变量。
24.声明引用时,引用必须初始化;
25.针对二维数组,数组的列固定时,可采用数组指针;数组的列不固定时,可采用指针数组,如字符串指针数组char *name[]。
26.函数重载时,不允许重定义默认参数。
27.
本文深入解析C++中的数组与指针概念,包括数组的声明、赋值及字符串处理函数,指针的定义、赋值与运算,以及数组指针与指针数组的区别。同时,探讨了值传递与指针传递的差异,动态内存分配方式,并阐述了内存安全问题,如空指针调用函数、引用与引用传递等关键知识点。
2674

被折叠的 条评论
为什么被折叠?



