C语言--关于指针两种初始化赋值操作的思考

版权声明:本文为博主原创文章,如需转载请注明出处。 https://blog.csdn.net/GOGOmusic/article/details/80286379

首先,什么叫做指针的初始化?
int * p = NULL;在定义指针变量p的同时把p的值设置为0x00000000;而不是把*p的值设置为0x00000000。这个过程叫做初始化。

探讨: int * p = & a; 和 int * p = &(int )0x0012ff60; 的含义和区别

(1)我们来看第一段代码:

#include <stdio.h>
int main(void)
{
    int a = 0;
    int *p = &a;
    printf("The value is: %d/n", *p);
    return 0;
}

我们怎样理解变量a呢?

一个变量具有一个变量名,对它赋值后就有一个变量值,变量名和变量值是两个不同的概念:变量名对应于内存单元的地址,表示变量在内存中的位置,而变量值则是放在内存单元中的数据,也就是内存单元的内容。变量名对应于地址,变量值对应于内容,应以区别。
​ 例如定义一个整形变量int x,编译器就会分配两个存储单元给x。如果给变量赋值,令x=30,这个值就会放入对应的存储单元中。虽然这个地址是由编译器分配的,但我们是无法事先确定的,但可以用取地址运算符&取出变量x的地址,例如取x变量的地址用&x。

我们怎样理解&取地址运算符呢?

​ 对于c语言中的&运算符,百度百科是这样定义的:(&p)则是这样一种运算,返回一个指针,该指针的值是当时声明p 时开辟的地址,指针的类型是p的类型对应的指针类型。该指针是由编译器分配,而不是由程序指定的,但指针值可以用&p取出的。

(2)我们来看第二段代码

#include "stdio.h"
int main(void) 
{ 
   // int a = 0; // &a = 0x0012ff60 
    int *p = (int*)0x0012ff60; 
    printf("The value is: %d/n", *p); 
    return 0; 
}

为什么不能直接用int *p = 0x0012ff60来完成初始化操作呢?

我们知道:赋值符号“=”左右两边数据类型应相同,在这里等号左右两边应同为指针类型。而0x0012ff60作为一个整形数据是不能直接赋值给指针类型的。

那么我们这么写可以吗?int *p = &0x01000;

这显然不行。因为对于一个数值常量,它是没有地址的。而变量之所以有地址就是因为要有一个存储单元对变量进行标识(当然,变量也可以直接映射到某个寄存器)。

我们将0x0012ff60强制类型转换(int*),这时它也变成一个指针类型,可完成赋值操作。

猜你喜欢

转载自blog.csdn.net/GOGOmusic/article/details/80286379