【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 ...
随机推荐
- 在Android Studio中创建(或添加)第一个Hello World应用程序
下面我们将使用Android Studio创建第一个简单的Hello World应用程序. 1.打开Android Studio,加载画面如下图所示: 2.选择”Start a new Andro ...
- spring-data-jpa 简单使用心得
对于总是使用mybatis的我,突发奇想的想使用spring-data-jpa搭一个小环境,这几天处处碰壁,现总结如下: 环境采用springboot maven需要导入: <dependenc ...
- DPDK 网卡RSS(receive side scaling)简介
网卡RSS(receive side scaling)简介 RSS是一种网卡驱动技术,能让多核系统中跨多个处理器的网络收包处理能力高效能分配.注意:由于同一个核的处理器超线程共享同一个执行引擎,这个效 ...
- STL 六大部件
stl具有上面6大部件 容器是存储数据的,原理主要是模板,容器只是负责存储数据,并不关心内存的存储情况,所以出现了分配器,分配器主要是负责为容器分配内存的,对于数据的操作被封装为一个个函数,也就是算法 ...
- PAT 1005 继续(3n+1)猜想
https://pintia.cn/problem-sets/994805260223102976/problems/994805320306507776 卡拉兹(Callatz)猜想已经在1001中 ...
- delphi如何模块内部获得自身路径ExtractFilePath和paramstr(0)
如何模块内部获得自身路径?Exe程序:DLL程序: ExtractFilePath(Application.ExeName) GetCurrentDir TIniFile.Create(GetCurr ...
- request.getParameterMap() 获取表单提交的键值对 并且 也能获取动态表单的key
Map<String,String[]> map = request.getParameterMap();Set<String> keys = map.keySet(); 获取 ...
- tomcat 路径"/"表示根目录
- Codeforces 662C(快速沃尔什变换 FWT)
感觉快速沃尔什变换和快速傅里叶变换有很大的区别啊orz 不是很明白为什么位运算也可以叫做卷积(或许不应该叫卷积吧) 我是看 http://blog.csdn.net/liangzhaoyang1/ar ...
- 【题解】HNOI2010合唱队
我果然还是太弱了呜呜呜……洛谷P3205 区间dp:注意到一段区间最两侧的人必然是最后加入队伍的所以由此我们可以分成两种情况来讨论. 一种是最后一个加入的人是左边的,另一种是右边的.那么状态:dp[i ...