以下对C语言的”指针“描述不正确的是:
想解释一下A选项:
指针变量存储的是内存的地址,所谓的内存地址就是一个编号而已。拿32位的操作系统举例,32位表示的是地址总线有32根,cpu通过这32根线确定一个内存单元。32位的0/1组合构成了这个6内存单元的地址,32位刚好4字节,所以指针占据4字节.但还是要根据操作系统位数来说。
就32位操作系统而言, int* p 和 char* p,指针p的大小都是4字节,至于指针前面的类型主要是针对于指针所指向的变量的。这个类型是告诉cpu取值的时候取多大,指定一个明确的范围。
数组的时候int p=(int)malloc(10*sizeof(int)) 释放的时候 free(p)即可;这是因为编译器对malloc做了一些特殊的处理,以保证可以正确释放内存。而当int *p=new int[10]释放的时候应为delete []p,注意[]的作用说明释放的是一个数组的内存,如果delete p则只是释放的p[0],其余9个int的内存没有释放;这是因为当指明为[]的时候,编译器实际上是做了一个循环来释放这个数组的所有内存。
在类和对象的时候会有很大区别。在使用malloc和free来处理动态内存的时候,仅仅是释放了这个对象所占的内存,而不会调用这个对象的析构函数;使用new和delete就可以既释放对象的内存的同时,调用这个对象的析构函数。
它们都是只把指针所指向的内存释放掉了,并没有把指针本身干掉。在free和delete之后,都需要把指向清理内存的指针置为空,即p=NULL,否则指针指向的内存空间虽然释放了,但是指针p的值还是记录的那块地址,该地址对应的内存是垃圾,p就成了“野指针”。同样会使人认为p是个合法的指针,如果程序较长,我们通常在使用一个指针前会检查p!=NULL,这样就起不到作用了。此时如果再释放p指向的空间,编译器就会报错,因为释放一个已经被释放过的空间是不合法的。而将其置为NULL之后再重复释放就不会产生问题,因为delete一个0指针是安全的。
1.指针消亡了,并不代表动态内存被自动释放了。
2.动态内存释放掉了,如果内存对应的是动态对象,则并不一定会调用这个对象的析构函数。调用了析构函数,并没有把指针消亡,或置为NULL;
3.动态内存记得用完了释放,指针记得不用了归NULL。不要让野指针野蛮生长
https://blog.csdn.net/gukesdo/article/details/7506155
32位系统下任何类型指针的长度都是4个字节 指针是地址 32位 就是 4个字节 正确