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. CodeForces 425E Sereja and Sets

    意甲冠军: 集S它包括了很多间隔[l,r]  和1<=l<=r<=n  f(S)个不相交的区间  问给出n和f(S)  有几种可能的S集合 思路: dp好题  至于为啥是dp-  我 ...

  2. Jenkins + robot framework + git持续集成

    安装略过... 一.Jenkins安装插件 进入系统管理—插件管理—可选插件下安装以下插件Git Client Plugin.GIT plugin.GitHub API Plugin.GitHub p ...

  3. POJ 1006 Biorhythms 中国的法律来解决剩余的正式

    这个问题以前用模拟的方法来解决亚军,正如溶液是一个通用的解决方案. 这里使用数学方法:剩下的孙子法(当然,被称为中国剩余法).由于建议的孙子.所以也承认外国的孙子是数学家. 参考数论建议大家学习的专业 ...

  4. Net开源网络爬虫

    转载.Net开源网络爬虫Abot介绍 .Net中也有很多很多开源的爬虫工具,abot就是其中之一.Abot是一个开源的.net爬虫,速度快,易于使用和扩展.项目的地址是https://code.goo ...

  5. 【转】Appium基于安卓的各种FindElement的控件定位方法实践

    原文地址:http://blog.csdn.net/zhubaitian/article/details/39754041#t11 AppiumDriver的各种findElement方法的尝试,尝试 ...

  6. 电脑报2014年第43期 pdf高清版

    电脑报2014年第43期 pdf高清版

  7. 安装ruby on rail

    安装: # nvm 安装, 两种方法 $ curl https://raw.githubusercontent.com/creationix/nvm/v0.8.0/install.sh | sh $ ...

  8. vistual studio 2012 安装失败,提示Microsoft Vistual Studio 2012 Devenv找不到元素,等错误信息

    在安装vistual studio 2012过程中,出现安装失败,提示Microsoft Vistual Studio 2012 Devenv找不到元素,等错误信息 解决方法是更新相应的server补 ...

  9. (转)iOS项目的目录结构和开发流程

    网上相关的资源不多,开源的且质量还不错的iOS项目也是少之又少,最近正好跟同事合作了一个iOS项目,来说说自己的一些想法. 目录结构 AppDelegate Models Macro General ...

  10. 创建GitHub技术博客

    创建GitHub技术博客全攻略 githubio技术博客网站生成 说明: 首先,你需要注册一个 github 账号,最好取一个有意义的名字,比如姓名全拼,昵称全拼,如果被占用,可以加上有意义的数字.本 ...