看黄邦勇帅的笔记。
指针和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 创建的内置类型数组的元素。