典型错误
long * fellow;
*fellow = 23333;
1 |
|
int * pt;
pt = 0xB8000000;
1 | 在这里左边是一个int类型的指针,而右边是一个 **整数**, 0xB8000000是老式计算机系统中组合段的偏移地址,但是在这条语句中编译器并不知道这是个地址,因此C++编译器会报错. |
int * pt;
pt = (int *) 0xB8000000;
1 |
|
int * pt = new int;
…
delete pt;
1 | 这将释放pt指向的内存块,但不会删除指针pt本身,它的值也没有改变. |
int * ps = new int; //ok
delete ps; //ok
delte ps; //not ok now
int jugs = 5; //ok
int * pi = &jugs; //ok
delete pi; //not allowed now, memory not allocated by ‘new’
1 |
|
delete的方括号告诉程序,应该释放整个数组,而不是仅仅是指针指向的元素
C++将数组名解释为地址(一般情况)
数组名被解释为其第一个元素的地址,而对数组名应用取地址符时,得到的是整个数组的地址.
1
2
3short tell[10];
cout << tell << endl; //display &tell[0]
cout << &tell << endl; //display address of whole array上面这个例子中,从数值上来说,这两个地址相同;但从概念上来说,
&tell[0]
(即tell)是一个2字节内存块地址,而&tell是一个20字节内存块的地址.因此,表达式tell+1将地址的值加2,而表达式&tell+1将地址的值加20.换句话说:*tell是一个short指针(short),而&tell是一个这样的指针,即指向包含20个元素的short数组(short()[20]).* 这种指针可以这样初始化:
short (*pas)[20] = &tell
.这里pas的类型为short (*)[20]
小结
应将内存地址赋值给指针.
可以是对已经赋值的变量名使用
&
来获得 被命名的内存的地址, 或者使用new运算符返回未命名的内存的地址,只有这两种情况可以赋值给指针.