1. 数组

1.1 数组作为函数参数

  (1) 如果使用数组作为函数的参数,则实参和形参都是数组名,且类型要相同。数组名做参数时传递的是地址

  (2) 使用方法:

    void rowSum(int a[][4], int n, int m);

    // 不能写成 int a[][];也不能写成int **a;

1.2 对象数组

  (1) 声明语句

    ① 类名 数组名[常量表达式];

  (2) 例子:

    Location a[2] = {Location(1,2), Location(3,4)};

    Location a[2] = {Location(1,2)};//此时,先初始化a[0]。再用默认构造函数初始化

    //a[1]

  (3) 当个元素对象的初值要求相同时,应该在类的默认构造函数里赋初值

2. 指针

2.1 内存空间的访问方式

2.2 指针变量的声明

  (1) 指针是一种数据类型,指针变量是用于存放内存单元地址的

2.3 与地址相关的运算 * 和 &

2.4 指针的赋值

  (1) 定义指针后最好要赋初值,不然可能会修改造成不可预见的错误

  (2) 数组名是个指针常量,不能变

  (3) 注意:

    ① 可以声明指向常量的指针,此时不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。如:

      int a;

      const int *p1 = &a;//声明的是p1指向的内容是常量

      int b;

      p1 = &b; //可以,指针指向内容可以改变

      *p1 = 1; //错误,指针指向内容不可变

    ② 可以声明指针类型的常量,此时指针值不能改变。区别上面的

      int *const p2 = &a;

      p2 = &b;//错误

    ③ 特殊的void*指针

      void *pv;

      int i = 5;

      pv = &i;

2.5 指针运算

  (1) 也就是相同类型地址之间的加减如 p1++;

2.6 用指针处理数组元素

  (1) 把数组作为函数形参,等价于把指向数组元素类型的指针作为形参如:

    void f(int p[]);

    void f(int p[3]);

    void f(int *p);//这三种方法等价

2.7 指针数组

  (1) 首先这是个数组,并且这个数组的元素是指针。

  (2) 声明方法

    数据类型 *数组名[下标表达式];

    int line1[] = {1,0};

    int line2[] = {2,0};

    int line3[] = {3,0};

    int *pline[3] = {line1, line2, line3};

2.8 指针作为函数参数

  (1) 以指针作为函数参数的三个作用

    ① 是形参与实参指向同一内存,达到双向传递的功能。也就是能改变实参的值

    ② 减少传递数据的开销

    ③ 可以通过指向函数的指针传递函数代码的首地址

  (2) 如果在函数中不需要改变指针所指向内容,则应在参数表中将其声明为指向常量的指针。

2.9 指针型函数

  (1) 当一个函数的返回值是指针类型(也就是地址)时,这个函数叫做指针型函数。

  (2) 声明方式:

    数据类型 * 函数名(参数表)

    {...}

2.10 指向函数的指针

  (1) 每个函数也要占用内存空间。而函数名就是这段函数存储的起始地址

  (2) 函数指针就是专门用来存放函数代码首地址的变量。

  (3) 声明方式:

    数据类型 (*函数指针名)(形参表)

    函数指针名 = 函数名;

  (4) 关于typeof简化定义(关于typeof详细请参考互联网)

    typeof int (*DoubleIntFunction)(double);

    //此时DoubleIntFunction即为函数指针类型了

    DoubleIntFunction funcPtr;

2.11 对象指针

  (1) 就是指向对象的指针

    ptr->data;

  (2) this指针

    ① 是个指针常量,具体用法比较简单,不写了

  (3) 指向类的非静态成员的指针(感觉用的不多,略)

  (4) 指向类的静态成员的指针(感觉用的不多,略)

3. 动态内存分配

3.1 new、delete初级

  (1) 语法:

    new 数据类型(初始化参数列表)

    如果成功返回首地址,否则抛出异常

  (2) 如果建立的对象是个基本类型的变量,初始化过程就是赋值如:int *p=new int(2)

    对于基本数据类型,如果不希望在分配内存后设定初值,可以把括号省去,如果保留括号,则用0来初始化如:

    int *point = new int;

    int *point2 = new int();

  (3)

    ① 如果建立的对象是某个类的实例对象,就是要根据初始化参数列表的参数类型和个数调用构造函数。

    ② 在new一个对象时,如果用户定义了默认构造函数则new T 与 new T() 效果相同;如果未定义,则new T时会调用系统生成的隐含的默认构造函数;new T() 除了执行默认构造函数的那些工作外还会用0赋初值

  (4) delete

    ① 语法:

    delete 指针名;//释放指针指向的内存空间

3.2 new创建数组类型对象;delete

  (1) 语法

    类型名 *数组名 = new 类型名 [数组长度];

  (2) 在new动态创建一维数组时,方括号外可以加(),但不能有参数,此时会用0赋初值

  (3) 删除

    delete[] 指针名;

3.3 assert断言

  在动态数组类中,可以通过类的成员函数访问数组元素,可以在每次访问前测试下标是否越界。这种检查可以通过C++的assert来进行,assert断言是在C++的cassert头文件中定义的红,判断一个条件表达式是否为true,如果不为true则程序会停止,并且报告错误。一般程序会通过两种模式编译——调试(debug)模式和发行(release)模式,assert只在调试模式有效。

3.4 创建多维数组

  (1) 创建三维数组

    int (*p)[10][10];

    p = new int[10][10][10]

    此时p既可以用作指针又可以以三维数组名来用

  (2) 动态创建多为数组(请参考本目录下C++动态创建多维数组)

4. 用vector创建数组对象

4.1 声明方式:

  (1) vector<元素类型> 数组对象名(数组长度, 元素初值);

4.2 与普通数组不同的是,vector声明的对象都需要初始化,普通类型用0,类对象调用默认构造函数。

5. 深复制浅复制

5.1 浅复制

  (1) 比如说一个类中有指针,浅复制的意思是这个类的指针和另外一个类的指针指向同一个内存地址,而不是真正的有个副本。这样的后果就是一个改变之后另外一个也会改变;调用析构函数时会析构两遍会出现错误。

5.2 深复制

  (1) 就是真的有个副本,完全相同copy的副本

6. 指针与引用

6.1 引用的实现机制需要依靠地址。因为只有通过地址才可以精确的指向一个变量。而指针是底层实现,而引用是高层实现,屏蔽了地址。这两者殊途同归。

6.2 两者的差别之一就是指针可以再赋值,而引用初始化后不能再赋值。

作者:viczzx 出处:http://www.cnblogs.com/zixuan-zhang 欢迎转载,也请保留这段声明。谢谢!

C/C++基础知识总结——数组、指针域、字符串的更多相关文章

  1. C基础知识(3):指针--概念、数组中指针的递增/递减、指针数组&数组指针、指向指针的指针

    指针是一个变量,其值为另一个变量的地址. 所有指针的值的实际数据类型,不管是整型.浮点型.字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数. 下面从4个代码例子分别讲述以下 ...

  2. 【C++基础】sizeof 数组 指针 空NULL

    笔试遇到很多sizeof的小题,博主基础堪忧,怒总结如下,还是要巩固基础啊啊啊! sizeof操作符 对象所占 栈内存空间的大小,单位是字节 关键词:char  数组 指针 结构体 class [注意 ...

  3. 【风马一族_php】NO5_php基础知识_数组

    原文来自:http://www.cnblogs.com/sows/p/6032570.html (博客园的)风马一族 侵犯版本,后果自负 回顾 匿名函数 定义: 变量 = function [参数列表 ...

  4. Java基础知识回顾(一):字符串小结

    Java的基础知识回顾之字符串 一.引言 很多人喜欢在前面加入赘述,事实上去技术网站找相关的内容的一般都应当已经对相应知识有一定了解,因此我不再过多赘述字符串到底是什么东西,在官网中已经写得很明确了, ...

  5. C语言基础知识(五)——数组与指针的等价表示

    void f(void) { int * p; int a[3] = {1,2,3}; p = a; printf("%d %d", a[0], p[0], *(a+1), *(p ...

  6. C语言基础知识【数组】

    2017年7月11日17:34:05C 数组1.C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量.数组的声明并不 ...

  7. 【学习】基础知识:数组和矢量计量【Numpy】

    Numpy是高性能科学计算和数据分析的基础包.功能如下: ndarray 一个具有矢量算法运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环) 用于读 ...

  8. c++基础知识篇:指针

    从面试的反馈来看,这部分可以问的很难. 1.指针与引用的区别 指针是一个变量,用来存放地址的变量.引用是原来变量的存储空间的别名.   2.指针作为参数的要点 a.需要进行指针的合法性检验,防止空指针 ...

  9. C/C++基础知识:函数指针和指针函数的基本概念

    [函数指针] 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址.可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指 ...

随机推荐

  1. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(8)-DbSession线程内唯一

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(8)-DbSession线程内唯一 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)   (1):框架搭建  ...

  2. Debug和Release的不同

     1. 变量. 大家都知道,debug跟release在初始化变量时所做的操作是不同的,debug是将每个字节位都赋成0xcc(注1),而release的赋值近似于随机(我想是直接从内存中分配的,没有 ...

  3. Unobtrusive JavaScript 是什么?

    Unobtrusive JavaScript 是什么? <!--以下是常规Javascript下写出来的Ajax--><div id="test">< ...

  4. C在宏定义中使用的语言可变参数

    于C标准库的语言,printf.scanf.sscanf.sprintf.sscanf入输出函数,參数都是可变的.在调试程序时.我们可能希望定义一个參数可变的输出函数来记录日志,那么用可变參数的宏是一 ...

  5. MVC自定义配置

    ASP.NET 5 入门 (2) – 自定义配置 ASP.NET 5 理解和入门 建立和开发ASP.NET 5 项目 初步理解ASP.NET5的配置 正如我的第一篇文章ASP.NET 5 (vNext ...

  6. VTune使用amplxe-cl进行Hardware Event-based Sampling Analysis 0分析

    于BASH正在使用VTune进行Hardware Event-based Sampling Analysis 0分析: 结果(部分)例如以下: 版权声明:本文博客原创文章.博客,未经同意,不得转载.

  7. 【百度地图API】如何制作商圈地图?行政地图?

    原文:[百度地图API]如何制作商圈地图?行政地图? 摘要: 想要显示某一个区域,并且鼠标放上去,该区域就会变色.这时,你就需要巧用多边形覆盖物,和它的鼠标事件了! 快来看看去哪儿网的实例吧:http ...

  8. MyEclipse优化全攻略

    (0) 吐槽 Eclipse仅仅是个半成品有木有?什么都须要自己安装插件,新手非常难用有木有? 安装上插件以后了版本号兼容和各种问题烦死人有木有? 都怪碎片和版本号乱公布有木有? IntelliJ I ...

  9. cocos2d 游戏开发实战

    文章转自:http://uliweb.clkg.org/tutorial/read/40 6   cocos2d 游戏开发实战 6.1   创建cocos2d项目 6.2   cocos2d v3 & ...

  10. Object-C中Category类体验

    Object-C中Category类体验 Object-C开发的时候有的时候会用到Category类,类似于Java和C#中扩展类,就是如果你觉得如果你觉得常用的方法在String中没有,可以根据业务 ...