《c++ primer》学习笔记 第四章 数组与指针

c++ primer》第四章* 数组与指针


数组

数组是存储同类型数据的集合。数组的维数必须是在编译期可以确定的常量,如整型字面值常量、枚举常量或者是常量表达式中已经初始化的const对象。数组定义如下:

const unsigned buff_size=50;

int int_size = 20;

const unsigned usize = getsize(); //getsize只能在运行时确定

其中,只有buff_size能作为数组的维数。int_size是变量,usize, getsize()的值都要在运行时才能确定。

数组可以在定义时直接初始化,用大括号{}括起来。如果数组元素没有提供初始值,会根据普通变量一样初始化。如int初始化为0string初始化为””。

需要指出的是对于特殊的字符数组需要注意结束字符串‘\0’的存在。如:

char ch[]={‘c’,’+’,’+’}; //没有结束符

char ch[]={‘c’,’+’,’+’,’\0’}; //显示加上结束符

char ch[]=”c++”; //自动加上结束符

c语言中,‘\0’是一个很重要的标志,用来确定数据边界。

指针与数组

指针用来指向对象,具体来说,指针保存的是一个对象的地址。

string s = “c++”;

string *ps = &s;

ps便是一个指向string对象的指针,ps指向的便是s的地址。

指针用来遍历数组,对数组的操作均可由指针来完成。

 

建议:(1)尽量避免使用指针与数组,取而代之的使用容器及迭代器。

(2)避免使用未初始化的指针!很多运行时错误都源于使用了未初始化的指针。

 

void* 指针

c++提供void*指针,它可以指向任何对象。void*指针表明该指针与某一地址值相关,但不清楚该对象上的类型。

 

关键概念:给指针赋值或通过指针进行赋值

给指针赋值是对指针本身进行的修改,意识是改变了指针的指向;而通过指针赋值则是对指针指向的对象进行更改。如:string s1(“some value”);

string *sp1=&s1;

 

string s2(“other value”);

string *sp2 = &s2;

 

*sp1 = “change value”; //通过指针进行赋值,将sp1指向的地址值由原来的some value改为change value

 

sp1 = sp2; //给指针赋值,更改sp1指向的地址,将sp1指向s2(other value)

指针与引用的区别

(1) 引用总是指向一个对象,且在定义时必须初始化,而指针不然。

(2) 引用始终指向同一个特定对象,所以定义时必须初始化。对引用赋值实质上是改变引用所指向对象的值。

const指针和指向const对象的指针

const指针是指指针对象本身不能改变,即一旦将是指针指向某一地址后就不能更改,因此很少用。

指向const对象的指针是指不能通过指针来更改所指向对象的值。如如果函数不改变传入参数的值,则将其定义为const类型。

 

cstring c风格的字符串

使用c风格的字符串时千万不要忘记结尾的null字符‘\0’。常用的操作从cstring的标准库函数有:

         

在调用strcatstrcpy时,调用着必须确保目标字符串有足够的大小空间,否则会产生严重错误。

为了确保安全,最好使用上述函数的安全版本:strncat, strncpy. 当然,更好的结果就是不要使用c风格的字符串,而是用c++string

 

string 类提供了一个名为 c_str 的成员函数,以实现我们的要求:

char *str = st2.c_str(); // almost ok, but not quite

c_str 函数返回 风格字符串,其字面意思是:“返回 风格字符串的表示方法”,即返回指向字符数组首地址的指针,该数组存放了与 string 对象相同的内容,并且以结束符 null 结束。

如果 c_str 返回的指针指向 const char 类型的数组,则上述初始化失败,这样做是为了避免修改该数组。正确的初始化应为:

const char *str = st2.c_str(); // ok

c_str 返回的数组并不保证一定是有效的,接下来对 st2 的操作有可能会改变 st2 的值,使刚才返回的数组失效。如果程序需要持续访问该数据,则应该复制 c_str 函数返回的数组。

动态数组

每一个程序在执行时都占用一块可用的内存空间,用于存放动态分配的对象,此内存空间称为程序的自由存储区或堆。语言程序使用一对标准库函数malloc 和 free 在自由存储区中分配存储空间,而 c++ 语言则使用 new delete 表达式实现相同的功能。

int *pia = new int[10]; // array of 10 uninitialized ints

此 new 表达式分配了一个含有 10 个 int 型元素的数组,并返回指向该数组第一个元素的指针,此返回值初始化了指针 pia

动态内存管理中需要注意的是new出来的对象,最后都需要使用delete显式回收。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值