C++primer学习笔记第四章-数组与指针

一、数组
1.数组的长度是固定,指的是一旦初始化就不能改变,相比vector是缺陷,但是速度更快;

2.初始化数组时,维数一定要是整型字面值常量、枚举常量或者const对象;如果没有显示初始化,则在函数体外默认初始化,函数体内不自动初始化;如果是类类型,则调用默认构造函数;

3.不允许数组直接复制和赋值,与vector不同;

4.数组下标类型是size_t

二、指针
1.声明:int *p1;

2.避免使用未初始化的指针,如果要分开定义指针和指向的对象,则将指针初始化为0,表示不指向任何对象;

3.指针和下标:int a[]={0,2,4,6,8}; int *p=&a[2]; int j=p[1];//p[1]相当于*(p+1)a[3]6 ,相当于解引用
int k=p[-2];//k相当于0

4.指向const对象的指针:const double *pp指针可以改变指向,但不能改变指向的对象,因为对象为const,不需要进行初始化。
Const指针:int i=0; int const* p =&i;必须初始化,不能改变指向。

5.typedef中使用指针往往会带来意外的结果。下面是一个几乎所有人刚开始时都会答错的问题。假设给出以下语句:

typedef string *pstring;

 

const pstring cstr;

请问 cstr 变量是什么类型?简单的回答是 const pstring 类型的指针。进一步问:const pstring 指针所表示的真实类型是什么?很多人都认为真正的类型是:   const string *cstr; 也就是说,const pstring 是一种指针,指向 string 类型的 const 对象,但这是错误的。错误的原因在于将 typedef 当做文本扩展了。声明 const pstring 时,const 修饰的是 pstring 的类型,这是一个指针。因此,该声明语句应该是把 cstr 定义为指向 string 类型对象的 const 指针,这个定义等价于: string *const cstr

string s;

typedef string *pstring;

const pstring cstr1 = &s; // written this way the type is obscured

pstring const cstr2 = &s; // all three decreations are the same type

string *const cstr3 = &s; // they're all const pointers to string

const有向右结合性,优先修饰右边的元素】

三、C风格字符串
1.标准库函数,首先引入头文件 #include<cstring>
strlen(s) ;返回s的长度,不包括字符串结束符null;注意:函数是以Null作为结束符。
对于char风格的:char ca1[]={‘C’,’+’,’-’};这里末尾没有null,最好别用
                 char ca2[]=”C+-”;系统末尾自动添加Null

2.动态数组:动态分配的数组不必再编译时知道其长度,可以在运行时才确定数组的长度。与数组变量不同,动态数组将一直存在,知道程序显式释放它为止。
C语言中使用一对标准库函数mallocfree在自由存储区中分配存储空间,C++使用newdelete
3.动态数组的定义只需指定类型和数组长度,不必为数组对象命名;
int *pia=new int[10];//返回指向新分配数组的第一个元素的指针。

且动态数组的初始化只能是元素类型的默认值,类类型为默认构造函数,内置类型无初始化。
内置类型可以通过 int *pia =new int[10]();//初始化为0
注意:用New动态创建长度为0的数组是合法的,但如果是数组变量就不行;

4.动态空间的释放: delete [] pia; // []表示是数组而非单个对象

5.const char *str=st2.c_str(); //c_str()返回指针指向C风格字符串的const char类型的数组,并且以null结束符

 

四、多维数组

1.int ia[3][4]={{0},{4},{8}};只初始化了每行的第一个元素,其他的函数体内默认初始化为0,函数体外没有初始化。

2.多维数组其实就是数组的数组,因此它的指针,应该是指向第一个内层数组的指针。
int ia[3][4];Int (*p)[4]=ia;ip=&ia[2];

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值