C/C++基础知识总结——数组、指针域、字符串
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++基础知识总结——数组、指针域、字符串的更多相关文章
- C基础知识(3):指针--概念、数组中指针的递增/递减、指针数组&数组指针、指向指针的指针
指针是一个变量,其值为另一个变量的地址. 所有指针的值的实际数据类型,不管是整型.浮点型.字符型,还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数. 下面从4个代码例子分别讲述以下 ...
- 【C++基础】sizeof 数组 指针 空NULL
笔试遇到很多sizeof的小题,博主基础堪忧,怒总结如下,还是要巩固基础啊啊啊! sizeof操作符 对象所占 栈内存空间的大小,单位是字节 关键词:char 数组 指针 结构体 class [注意 ...
- 【风马一族_php】NO5_php基础知识_数组
原文来自:http://www.cnblogs.com/sows/p/6032570.html (博客园的)风马一族 侵犯版本,后果自负 回顾 匿名函数 定义: 变量 = function [参数列表 ...
- Java基础知识回顾(一):字符串小结
Java的基础知识回顾之字符串 一.引言 很多人喜欢在前面加入赘述,事实上去技术网站找相关的内容的一般都应当已经对相应知识有一定了解,因此我不再过多赘述字符串到底是什么东西,在官网中已经写得很明确了, ...
- C语言基础知识(五)——数组与指针的等价表示
void f(void) { int * p; int a[3] = {1,2,3}; p = a; printf("%d %d", a[0], p[0], *(a+1), *(p ...
- C语言基础知识【数组】
2017年7月11日17:34:05C 数组1.C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量.数组的声明并不 ...
- 【学习】基础知识:数组和矢量计量【Numpy】
Numpy是高性能科学计算和数据分析的基础包.功能如下: ndarray 一个具有矢量算法运算和复杂广播能力的快速且节省空间的多维数组 用于对整组数据进行快速运算的标准数学函数(无需编写循环) 用于读 ...
- c++基础知识篇:指针
从面试的反馈来看,这部分可以问的很难. 1.指针与引用的区别 指针是一个变量,用来存放地址的变量.引用是原来变量的存储空间的别名. 2.指针作为参数的要点 a.需要进行指针的合法性检验,防止空指针 ...
- C/C++基础知识:函数指针和指针函数的基本概念
[函数指针] 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址.可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指 ...
随机推荐
- VAXVOIP SDK Licensekey
Insert the following key to the SDK with SetLicenseKey call: VAXVOIP.COM-191P238P55P253P97P229P51P76 ...
- ural 1932 The Secret of Identifier 容斥
主题链接:点击打开链接 stl+容斥 #include <cstdio> #include <cstring> #include <algorithm> #incl ...
- SD3.0四个协议解读
前面的文章提到过SD卡主要分为两个操作模式,一是初始化和识别操作模式.还有一种就是这篇文章须要分析的传输数据模式啦. 传输数据模式: 传输数据模式主要有六种状态,各自是Stand-by状态.Trans ...
- Objective-C马路成魔【12-分类和协议】
郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠,支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 分类与协议 ...
- php_ThinkPHP的RBAC(基于角色权限控制)详解
一.什么是RBAC 基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注. 在RBAC中,权限与角色相关联,用户通 ...
- 【C++实现】HeadFirst策略模式设计模式
策略模式定义了算法家族.分别封装起来.让它们之间能够相互替换,此模式让算法的变化独立于使用算法的客户. Head First设计模式中介绍策略模式时以Duck类作为样例.当中用flyBehavior和 ...
- js拾遗:appendChild 添加移动节点
原文:js拾遗:appendChild 添加移动节点 写js一年多了,一直以为自己很牛逼,开始写各种博文分享,昨天写了一篇<浅谈 IE下innerHTML导致的问题>在看了下面的评论,我才 ...
- IOS、java支持DES加密
转载请注明博客地址:http://blog.csdn.net/mengxiangyue/article/details/40015727 近期在考虑数据加密方面的需求,所以对数据加密简单的看了一下,当 ...
- python算法题
python几道简单的算法题 最近看了python的语法,但是总感觉不知道怎么使用它,还是先来敲敲一些简单的程序吧. 1.题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都 ...
- ultraEdit-32 PHP/HTML智能提示
原文 ultraEdit-32 PHP/HTML智能提示 高级–>配置–>编辑器–>自动完成–>勾选自动显示……选项,在下面输入框中输入你要求输出多个字符才出现提示,比如 ec ...