【C++】指针和new相关
看黄邦勇帅的笔记。
指针和new之前觉得已经掌握的很好了,可是看了资料还是get到了新知识。记录一下。
1.指针只支持 4 种算术运算符:++,――,+,-.指针只能与整数加减.指针运算的原则是:每当指针的值增加时,它将指向其基本类型的下一个元素的存储单元.减少时则指向上一个元素的存储单元.
2.注意两个指针不能相加. 例 int *p; p=&x; 假设 x 的地址为 200, 则 p+9 将的指针地址将是 200+4*9=236,即 p 指向了从当前正指向的元素向下的第 9 个元素.
3.两指针相减,同类型的一个指针减去另一个指针的值将是两个指针分开的基本类型的元素的个数.
4.const int x=1; int *p=&x;这样做将发生错误,因为如果把 x 的地址给了 p,而指针 p 又修改了 x 的值时,这时 x 就违反了是常量的 规定,所以不允许这样做。
5. int a[10]; 则 a 等于 &a[0]
int b[3][4]; 则b 等于 &b[0], b[0] 等于 &b[0][0] 即数组名是首元素的地址。
6. 多维数组怪现象: int b[3][4]; 则 *b 等于 b,因为 *b = *(&b[0]) = b[0] = &b[0][0] = b
7.多维数组计算的技巧:
A.对于像 b[1]这样的地址,最好应表示为&b[1][0]再进行偏移计算;
B.对于有小括号的地方,一定不要省略小括号。比如(&b[1])[1]与&b[1][1]将表示的是不同的结果,第二个是显然的,对于第一个(&b[1])[1]=*((&b[1])+1)=*(&b[1]+1)=*(&b[2])=b[2]
例:*(b+1)[1]:*(b+1)[1]=**((b+1)+1)=**(b+2)=*(*(b+2))=*b[2]=b[2][0] (因为[ ]运算符高于指针)
8.对于多维数组 a[n][m][i][j],那么这些地址是相同的,即数组名a, a[0],a[0][0], a[0][0][0], &a[0][0][0][0],都是相同的地址。要得到第一个元素的值,应该****a,也就是对 4 维数组需要求 4 次指针运算。同样可以看到,对数组名进行的前三次指针运算的值都是相同的,即*a, **a, ***a 和 a 的值都是&a[0][0][0][0]的值。
9.当把 int y[4]赋给指针 int(*p)[4] 时 p=y 将是错误的,正确的方式为 p=&y 因为这时编译器会检查赋给指针 p 的元素是否是含有四个元素的数组,如果是就能 正确的赋值.但语句 p=y 中的 y 代表的是数组 y[4]第一行第一列的元素的地址也就是&y[0]的地址,因此 y 指向的地址只有一个元素,而指针 p 要求的是有 4 个元素的数组的地址,因此语句p=y 将出错。
10.int (*p)[4]与语句 int x[][4]等价。
11.动态创建数组:
一维:int *p=new int [11];
二维:int (*p)[102]=new int [4][102] (删除 delete [] p;)
12. 动态创建对象的初始化:int *p=new int(102)该语句表明 由p 指向的新创建你对象被初始化为102。
13. 而对于内置类型或没有默认构造函数的类型,则采用不同的初始化方式就会有显著不同的差别。例如:int *p=new int; int *p=new int();第一条语句没
有被初始化,而第二条被初始化为0。
14.用 new 动态创建的数组不能被初始化
15.不能在空闲存储区上创建内置类型元素(除类数组 string 外)的 const 数组。因为我们不能初始化用 new 创建的内置类型数组的元素。
【C++】指针和new相关的更多相关文章
- 指向函数的指针与iOS-Block相关知识
指向函数的指针与iOS-Block相关知识 一. 函数指针的定义和调用: 关于函数指针的知识详细可参考:http://www.cnblogs.com/mjios/archive/2013/03/19/ ...
- C 语言中的指针和内存泄漏
引言对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧 ...
- C语言中的指针和内存泄漏
引言 对于任何使用C语言的人,如果问他们C语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏惧,但是 ...
- 由strcat函数引发的C语言中数组和指针问题的思考
问题一 首先,来看一下下面这段代码: #include <stdio.h> #include <string.h> int main() { char *str = " ...
- [C]C语言中的指针和内存泄漏几种情况
引言 原文地址:http://www.cnblogs.com/archimedes/p/c-point-memory-leak.html,转载请注明源地址. 对于任何使用C语言的人,如果问他们C语言的 ...
- C语言中的指针和内存泄漏几种情况
引言 原文地址:http://www.cnblogs.com/archimedes/p/c-point-memory-leak.html,转载请注明源地址. 对于任何使用C语言的人,如果问他们C语言的 ...
- C 的指针和内存泄漏
引言 对于任何使用 C 语言的人,如果问他们 C 语言的最大烦恼是什么,其中许多人可能会回答说是指针和内存泄漏.这些的确是消耗了开发人员大多数调试时间的事项.指针和内存泄漏对某些开发人员来说似乎令人畏 ...
- 对比 C++ 和 Python,谈谈指针与引用
花下猫语:本文是学习群内 樱雨楼 小姐姐的投稿.之前已发布过她的一篇作品<当谈论迭代器时,我谈些什么?>,大受好评.本文依然是对比 C++ 与 Python,来探讨编程语言中极其重要的概念 ...
- [CPP] 智能指针
介绍 C++ 的智能指针 (Smart Pointers) 相关 API. C++ 中的智能指针是为了解决内存泄漏.重复释放等问题而提出的,它基于 RAII (Resource Acquisition ...
随机推荐
- [译]如何去除Git的unstaged的文件提示“old mode 100755 new mode 100644”?
原文来源:https://stackoverflow.com/questions/1257592/how-do-i-remove-files-saying-old-mode-100755-new-mo ...
- 软工实践 - 第二十九次作业 Beta 冲刺(7/7)
队名:起床一起肝活队 组长博客:https://www.cnblogs.com/dawnduck/p/10159251.html 作业博客:[班级博客本次作业的链接] (https://edu.cnb ...
- 【bzoj1455】罗马游戏 可并堆+并查集
题目描述 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻.他决定玩这样 ...
- P1712 [NOI2016]区间
题目描述 在数轴上有 NN 个闭区间 [l_1,r_1],[l_2,r_2],...,[l_n,r_n][l1,r1],[l2,r2],...,[ln,rn] .现在要从中选出 MM 个区 ...
- WebServer参数长度超出解决
当内容超过了4M会报错 System.Web.Services.Protocols.SoapException: 运行配置文件中指定的扩展时出现异常. ---> System.Web.HttpE ...
- [洛谷P3254]圆桌问题
题目大意:有$m$个单位,每个单位有$r_i$个代表,有$n$张餐桌,每张餐桌可容纳$c_i$个代表.要求同一个单位的代表不在同一个餐桌就餐.若可以,输出$1$以及其中一种方案,否则输出$0$ 题解: ...
- visio应用程序相关设置-选项-常规
1.用户名称,可读写 ApplicationSettings.UserName m_Visio.Window.Application.Settings.UserName = "BEIJING ...
- WCF分布式开发步步为赢(13):WCF服务离线操作与消息队列MSMQ
之前曾经写过一个关于MSMQ消息队列的文章:WCF分布式开发必备知识(1):MSMQ消息队列 ,当时的目的也是用它来作为学习WCF 消息队列MSMQ编程的基础文章.在那篇文章里,我们详细介绍了MSMQ ...
- innodb_stats_on_metadata and slow queries on INFORMATION_SCHEMA
INFORMATION_SCHEMA is usually the place to go when you want to get facts about a system (how many ta ...
- Oulipo HDU - 1686
The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...