对C++中指针声明和初始化指针理解之一

1.计算机需要跟踪指针指向的值的类型。char的地址与double的地址看上去没有两样,但char和double使用的字节数是不同的,他们存储时使用的内部格式也不同。因此指针声明必须制定指针指向的数据的类型。

int* p_updates;

如上实例:*p_updates的类型为int。由于*运算符被用于指针,因此p_updates变量本身必须是指针。我们说p_updates指向int类型,我们还说p_updates的类型是指向int的指针,或int*。可以这样说,p_updates是指针(地址),而*p_updates是int,而不是指针。

int* p1, p2;
double* tax_ptr;
char* str;

对于上述的声明是创建一个指针(p1)和一个int变量(p2)。注意:int* 是一种复合类型,是指向int的指针。指针变量不仅仅是指针,而且是一个以浮点格式存储的值。tax_ptr声明为一个指向double的指针,因此编译器知道*tax_ptr是一个double类型的值。也就是说,它知道*tax_ptr是一个以浮点格式存储的值,这个值(在大多说系统上)占据8个字节。指针变量不仅仅是指针,而且是一个指向特定类型的指针。tax_ptr的类型是指向double的指针(或double*类型),str是指向char的指针类型(或char*)。尽管他们都是指针,却是不同类型的指针。和数组一样,指针都是基于其他类型的。

虽然tax_ptr和str指向两种长度不同的数据类型,但这两个变量本身的长度通常是相同的。也就是说,char的地址与double的地址的长度相同,这就好比1016可能是超市的街道地址,而1024可以是小村庄的街道地址一样。地址的长度或值既不能指示关于变量的长度或类型的任何信息,也不能指示该地址上有什么建筑物。一般来说,地址需要2个还是4个字节,取决于计算机系统(有些系统可能需要更大的地址,系统可以针对不同的类型使用不同的长度的地址)。

注意:指针的危险

在C++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指向的数据的内存。

long* fellow;
*fellow = 223323;
//fellow是一个指针,但它指向哪里呢?上述代码没有将地址赋给fellow,

fellow确实是一个指针,但它指向哪里呢?上述实例没有将地址赋给fellow。那么223323将被放到哪呢?我们不知道。由于fellow没有被初始化,它可能有任何值。不管值是什么。程序都将它解释为存储223323的地址。如果fellow没有被初始化,它可能有任何值。这种错误可能导致一些最隐匿的错误。

猜你喜欢

转载自blog.csdn.net/qq_34138155/article/details/81217120