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++基础知识:函数指针和指针函数的基本概念
[函数指针] 在程序运行中,函数代码是程序的算法指令部分,它们和数组一样也占用存储空间,都有相应的地址.可以使用指针变量指向数组的首地址,也可以使用指针变量指向函数代码的首地址,指向函数代码首地址的指 ...
随机推荐
- jquery.validate1.13
jquery.validate新的写法(jquery.validate1.13.js) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 ...
- Asp.Net超时问题汇总
在数据库或者请求操作时,如果选择的时间段过短或操作数据量过大,就会遇到"请求超时"的的问题,网络上提供很多解决方案,但普遍不完善,根据个人经验及参考网络解决方案,先将其汇总如下: ...
- 【iOS发展-70】点菜系统案例:使用文本框inputView和inputAccessoryView串联UIPickerView、UIDatePicker和UIToolBar
(1)效果 (2)先在storyboard中设计界面,然后源码(直接在ViewController中码) #import "ViewController.h" @interface ...
- DirectX11 学习笔记3 - 创建一个立方体 和 轴
该方案将在进一步的程序 面向对象. 独立的模型类.更像是一个框架. 其中以超过遇到了一个非常有趣的问题,.获得一晚.我读了好几遍,以找到其他的列子.必须放在某些功能Render里面实时更新,而不是仅仅 ...
- java_log4j 经典配置
程序加载制定日志文件 public static final String log4j = "log4j.xml"; /** * @declare 加载log4j * @throw ...
- csu 1503: 点弧之间的距离-湖南省第十届大学生计算机程序设计大赛
这是--比量p并用交点连接中心不上弧.在于:它至p距离.是不是p与端点之间的最短距离 #include<iostream> #include<map> #include< ...
- Socket 学习(三).5 UDP 的弱点
前面 讲到了,udp 传输文本的例子,发现 udp 确实 比tcp 高效一些,现在我用来传输文件,问题果然来了,结果发现 他不能一次 传输大于 64K的东西! 那么 我自然想到了 切包,多次发送,再合 ...
- Redis 3.0集群搭建/配置/FAQ
·声明 1,已官网中文教程为基础,边看边学,结合环境现状搭建. 2,哥对Ruby不热爱.不熟悉.不感冒,所述内容如有疑义请谅解. 3,3.0官说集群还在测试中,其实用用也还算马马虎虎,对外集群API真 ...
- vistual studio 2012 安装失败,提示Microsoft Vistual Studio 2012 Devenv找不到元素,等错误信息
在安装vistual studio 2012过程中,出现安装失败,提示Microsoft Vistual Studio 2012 Devenv找不到元素,等错误信息 解决方法是更新相应的server补 ...
- 多线程编程 (2) -NSOperation
一.NSInvocationOperation 二.NSBlockOperation 三.NSOperation的其他用法 四.自定义NSOperation 1.上一讲简单介绍了NSThread的使用 ...