本节使用的程序段
#include1、如何找到常规变量的地址int main() { using namespace std; int a = 1; // 地址运算符 & 的应用 cout << "a value = " << a << endl; cout << "a address = " << &a << endl; // 地址运算符得到 a 的地址 // 解除引用运算符 * 的应用 int b = 1; // 声明并且初始化指针 int* ptr = &b; cout << "*ptr: " << *ptr << endl; cout << "ptr_value: " << ptr << endl; return 0; }
使用地址运算符(&),就可以得到常规变量的地址。比如,Home 是一个变量,则 &Home 是它的地址。使用常规变量时,值是指定的量,而地址是派生量。具体使用参考程序段。
2、如何通过地址得到变量值处理数据的策略与得到地址的策略刚好相反,将地址视为指定的量,而将值视为派生量。一种特殊的变量—指针,用于存储值的地址。因此,指针名表示的是地址。 * 运算符被称为间接值或解除引用运算符,将其应用于指针,可得到该地址处存储的值。比如 ptr 是一个指针,其对应的值为 value,那么有 value = *ptr;
3、声明和初始化指针 3.1 声明指针计算机需要跟踪指针指向的值得类型。例如,char 的地址与 double 的地址所使用的字节数是不同的,并且它们存储值时使用的内部格式也不同。因此,指针声明必须指定指向的数据的类型。
例如以下示例:
int *ptr;
这表明,*ptr 的类型为 int。由于 * 运算符被用于指针,因此 ptr 变量本身必须是指针。我们说 ptr 指向 int 类型,我们还说 ptr 的类型是指向 int 的指针,或 int * 。
这强调的是,int * 是一种类型—指向 int 的指针。它是一种复合类型。
指针变量不仅仅是指针,而是指向特定类型的指针。和数组一样,指针都是基于其它类型的。对于不同的类型(int、long 等),指针的内部 *** 作不同。
指针指示某变量的地址,对于不同类型的变量,比如 char 或者 double,他们对应的指针变量的长度通常是相同的,也就是它们对应的地址长度通常是相同的。地址需要 2 个字节还是 4 个字节,取决于计算机系统。
3.3 初始化指针 3.3.1 先声明再初始化int a = 1; int *ptr; ptr = &a;3.3.2 声明的同时初始化
在这种情况下,被初始化的是指针,而不是它指向的值,即下面的语句将 ptr (而非 *ptr)的值设置为 &a:
int a = 1; int *ptr = &a;4、指针的危险
在 c++ 中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。 如下所示:
long * fellow; * fellow = 223323;
fellow 在声明中表示为一个指针,但是上述代码并没有对指针进行初始化,也就是并没有给指针一个值,这个值为变量的地址。fellow 没有被初始化,那么其值可能是任何值,不管值为什么,程序都将它解释为存储 223323 的地址。如果 fellow 的值恰好为1000,计算机将把数据放在地址 1000 上。
因此,一定要在对指针应用解除引用运算符 (*)之前,将指针初始化为一个确定的地址。
此外,指针不是整型,因此不能简单地将整数赋给指针,也不能对指针进行算术运算。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)