全部博文(82)
分类: C/C++
2009-12-13 16:26:56
指针:
为了便于内存单元的存取,系统为每个内存单元分配了一个地址。在程序中将定义指向“地址”的变量,即指针变量,简称指针。
指针式一类特殊的变量,它保存的是程序中一个对象(如整型、实型变量)在内存中的地址。
内存地址的长度和机器字长一样。即指针变量做保存的长度是固定的,只与机器有关,指针的类型仅用于告知编译系统如何将指针所指的二进制序列翻译成实际的数据。
例:
#include
void main()
{
int n = 12345;
char ch = 'a';
int *p = &n;
cout << "&p = " << &p << endl;
cout << "p = " << p << endl;
cout << "*p = " << *p << endl;
cout << "n = " << n << endl;
cout << "&n = " << &n << endl;
cout << "sizeof(p) = " << sizeof(p) << endl;
cout << "sizeof(*p) = " << sizeof(*p) << endl;
cout << "sizeof(n) = " << sizeof(n) << endl;
cout << "sizeof(&n) = " << sizeof(&n) << endl;
cout << "sizeof(ch) = " << sizeof(ch) << endl;
cout << "sizeof(&ch) = " << sizeof(&ch) << endl;
}
执行结果:
&p = 0x0012FF74
p = 0x0012FF7C
*p = 12345
n = 12345
&n = 0x0012FF7C
sizeof(p) = 4
sizeof(*p) = 4
sizeof(n) = 4
sizeof(&n) = 4
sizeof(ch) = 1
sizeof(&ch) = 4
注意:sizeof计算的是数据类型的长度,strlen计算的是字符串的长度(以'\0'为结束标志,但是'\0'不计算在字符串长度内,字符串在内存中所占空间,要加上1,也就是'\0'所占的空间)。
指针的初始化:
1)、指针对象可以被一个具有相同类型的对象初始化。
例:
Int i = 10;
Int *p1 = &i;
2)、由另一个同一类型的指针初始化,同一类型的指针之间可以直接赋值。
Int *p2 = p1;
如果要强制赋给指针另一种类型变量的地址,则必须显示进行类型转换。
Float *fp = (float * )ip;
3)通过直接分配内存地址得到初始值。
Int *ip = new int ; //通过直接分配内存给指针赋值
可以给指针变量赋予空值(NULL),这表明它不指向任何一个对象,此时,该指针只能读取其自身值,不能对该指针做‘*’和‘&’运算。
指针也可以没有类型,或者说类型为void *,这样指针可以指向任何对象,因而称为通用指针。使用时,需要显示地指出通用指针所指数据的类型。
Int i = 1000;
Int *ip = &i;
Void *vp;
Float *fp1;
Vp = ip;
Fp = (float * )vp;
Int k = *ip; //k = 1000
指针与数组的关系:
数组名可以认为是常量指针,它指向存放数组第一个元素的内存地址。
指针可以完成任何涉及数组下标的操作。
实际上,数组下标表示法在编译期间将转换为指针表示法,所以用指针方式来书写数组下标表达式可以节省编译时间。
数组是一个地址常量,在程序中不能将数组名作为变量赋值,而指针是一个变量,可以多次赋值。
数组在定义时就根据指定的大小分配好了内存空间,而指针只是一个变量。
New 与 delete:
数组在定义时就根据指定的大小分配好了内存空间,而指针只是一个变量,定义时一般没有内存空间。new运算可以为指针分配一片内存空间。与delete运算符一起使用,达到直接进行动态内存分配和释放的目的。
运算符new返回指定类型的一个指针,如果分配失败(没有足够的内存空间),则返回0.
Double *p;
P = new double;
系统自动根据double类型的大小开辟一个内存单元,并将地址放在指针p中。
运算符delete操作时释放new请求道德内存。
如: delete p;
注意点:
1)、运算符delete必须用于先前new分配的有效指针。如果使用了未定义的其他任何类型的指针(未有效分配地址),会带来严重问题。
2)、用new可以指定分配的内存大小。
如: int *p;
P = new int(60); //为指针p开辟60个字节的内存空间
...
Delete p;
3)、new可以为数组分配内存,但是释放时,必须告诉delete数组有多少个元素。
如: int *p;
P = new int[10];
...
Delete [10]p;