int main() {
int i, *p;
i = 10;
*p = i;
}
报错:
警告 C6001 使用未初始化的内存“p”。
错误 C4700 使用了未初始化的局部变量“p”
被指针折磨了很多年,有时候理解,过段时间又忘了。
写个什么来加深一下印象吧。
指针是地址,指针是地址,指针是地址!
看看代码,先看看
int *p;//首先声明了p是个指针变量,其次这个指针变量是指向int类型的。
再看
*p=i;
相信不少初学者都栽在这里,按理说*p=i是把i的值赋给int型的*p,没有任何毛病,为什么会报错?
使用了未初始化的局部变量“p”到底是什么鬼?
当时程序执行到int i时,变量i就有地址了,但是int *p只是说明这是个int类型的地址,地址到底是多少还不知道。
如果一个邮递员,负责一块片区有若干客户,有的是棚户区(char),有平房(short),有商品房(int),有别墅(long),还有企业用户(数组,string),那他手里拿的客户地址就是p,现在要给客户i送快递,这个快递的内容是10,但是老板没有告诉他i的地址,他当然不知所措,没有得到确切的地址之前,只知道这个快递员可能要负责商品房区的快递(int),要注意的是int *p=i,是要把i的值10,存到地址p(p:内存地址)对应的这个房子(*p:存储空间里存放的物品)里,等同于*p=10,但是问题出地址p(p:内存地址)现在还是未知的,也就是所谓的野指针,编译器提示错误算好的了,如果直接编译过了,那程序运行会造成的后果是未知的,如果邮递员为了送出快递,随心所欲的给了任意一个客户。
那怎么解决也就简单了,先告诉邮递员这个i的地址就可以了:
p = &i;
这样邮递员就建立了于客户i的关系,以后再用*p就可以存取了。
int i, *p;
i = 10;
p = &i;
*p = 0;
说点多余的,这个时候*p是0,p是i的地址,&p是p的地址(指针变量的地址),说实话,指针这个名字真的取的不太好,叫地址变量或地址型更加贴切,如果int型地址变量p,更容易记得住不是吗?