以32位平台为例,
char c; // 声明一个字符变量c,并为其分配一个8bit的空间,假设为0x22334455
c=41; // 将字符'A'放到刚才分配的0x22334455空间中
char *p = NULL; // 声明一个字符指针p,并为其分配一个32bit的空间,假设为0x44556677,p的值初始化为0
p=&c; // 将0x22334455赋值给p,存入0x44556677中。
p=new char; // 申请一块新的内存,大小为8bit,假设其开始地址为0x88990011,则此时0x44556677中存放的值为0x88990011
delete p; // 释放刚才申请的空间。p的值将被修改,此时0x44556677中存放的地址是未知且危险的。
p = NULL; // 将0x44556677中的值置0。
=====
因此你所认为的:
1. 声明一个指针int *p;后,就已经分配了内存
正确
2. int *p;后 &p是有实际的地址的
意思正确,表达有问题。应该说p是有实际地址的,&p就是这个地址,在上面的例子中为0x44556677。
3. 只是没有该内存中赋值时,编译器会自动给该指针赋值为0xcccccccc
基本正确。这是VC干的事情,在VC中基本上未初始化的指针都是这个值,但是平台不一样这个值可能会不同。因此为了自己判断的方便,闲置或初始化的指针一般都设为NULL。
int *p 是有分配内存的 这个内存里面放着指向一个int类型的指针 他的大小在现在的一般机器上是4个字节 但是这个指针指向的地方还没有分配内存, 而&p取的是这个指针的地址是存在的
这样就OK了,用的是C的话,C语言中声明变量要放在最前边。。。C 中没有这个限制。 你写的代码没问题 估计是编译器的链接出了些问题,我在我的
在函数体外定义的基础类型变量会初始化,
函数体内定义的基础类型变量不会有自动初始化
不知道你得理解是不是和我一样.
首先,&p得到的是变量p的地址,这个与p所指向的地址是肯定不同的,&p有值不能代表什么.
然后,分析下int a=10这种写法.在内存中某个假设编号是0x8adf23fe的位置,有块内存,里面写入了值10; 再看int* p=&a这种写法,在内存中某个假设编号是0x23bb8786的位置,有块内存,里面写入了值0x8adf23fe;
所以呢,p不管怎么说,也是个变量,这个变量的值,是另外一个变量的地址而已;如果p没有初始化,编译器就默认把p的值设置成0xcccccccc这个地址,在这个地址中,内存的值被认定为不可读.
当malloc分配内存后,编译器将0x23adad99~0x23adaaaa这段内存设置为可以供你使用的,然后将内存的头的地址返回,你用p接受到这个地址