c语言,空指针,野指针,通用指针
野指针是没有初始化的指针,想指哪里指哪里,空指针是指向0的指针,对吧?
指针怎么可以指向一个常数0呢,指针应该指向一个储存空间啊?why?
还有空指针有啥用?
还有通用指针是什么?void *定义的么,
指针是定义好类型之后,才知道取所指向地址内容的时候 应该 取 多大一段字节的,
通用指针有啥用?
还有啊,网上搜到的那些我没看懂,求不复制粘贴 展开
空指针:空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。
通用指针:通用指针,它可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void 指针。
野指针:野指针也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。空指针用0表示,C语言保证这个值不会是任何对象的地址。给指针值赋零则使它不再指向任何有意义的东西。为了提高程序的可读性,标准库定义了一个与0等价的符号常量NULL. 程序里可以写 p = 0; 或者 p = NULL; 两种写法都把p置为空指针值。相对而言,前一种写法更容易使读程序的人意识到这里是一个指针赋值。我们印象中C语言的指针都有类型,实际上也存在一种例外。
这里涉及到通用指针,它可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void 指针。
野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:
①指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
②指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。
所以指针没有指向常数0,它指向的存储空间是NULL,暂时为0.
指向的那个储存空间是NULL,NULL 是内存中的一个特定的位置么?
正常的指针本身所占的内存中都存放一个地址,空指针存放0,是这个意思么
正常的指针是指向内存的一片区域,指针的值就是这片内存的地址,而指针所指向的值是这片内存存放的实际内容;
空指针,就是不指向内存任何区域,所以就是用NULL来代替
空指针不是指向常数0,只指向地址0,即NULL,其实换句话说,指针的本质就是地址嘛,空指针就是指针本身的值(地址)为0
空指针的作用是防止野指针的出现,因为我们不能知道野指针到底指向哪里,所以我们也无法判断一个指针是否是野指针,这样很危险,但如果养成将指针初始化为空指针的习惯,我们就能判断出这个指针是不是有效的(判断是不是NULL就可以了)
通用指针一般都用在函数传参,实现所谓的“多态”,但到函数里面使用时,一般还是被转换成具体类型的指针。
空指针不是指向常数0,只指向地址0,即NULL,其实换句话说,指针的本质就是地址嘛,空指针就是指针本身的值(地址)为0
空指针的作用是防止野指针的出现,因为我们不能知道野指针到底指向哪里,所以我们也无法判断一个指针是否是野指针,这样很危险,但如果养成将指针初始化为空指针的习惯,我们就能判断出这个指针是不是有效的(判断是不是NULL就可以了)
通用指针一般都用在函数传参,实现所谓的“多态”,但到函数里面使用时,一般还是被转换成具体类型的指针。
但如果养成将指针初始化为空指针的习惯,我们就能判断出这个指针是不是有效的(判断是不是NULL就可以了)
这句话不懂哎,为何要养成将指针初始化为空指针的习惯,直接初始化成想要的不就行了么,干嘛要初始化成空的,防止野指针出现么?小心一点不就好了么,要是每个指针都要先初始化成空指针,然后在赋值,岂不是太麻烦,而且好降低程序效率?
判断这个指针是不是有效的,为啥要判断一个指针是不是有效的?有啥用?
这种例子有很多,比如:
void *pA = NULL;
/**
* 中间有一些程序,可能给pA分配内存,也可能不分配
* 可能是对pA的一些复杂操作
**/
if (pA != NULL) {
free(pA);
}
其实说实话,每个人写程序的风格不同,并且C语言如此灵活,绝对没有固定的写法或套路,只是有时候某种习惯能避免我们出错,不要说只要够细心调试就可以不出错,这么说的一定都没写过10W行以上的大型应用。
再说效率,如果说一个好的习惯可以极大的提高可读性,降低出错的概率,那么即使有一些效率上的损失,也可以接受,况且,指针的这些习惯对效率的降低微乎其微。
我刚学C语言时也觉得太麻烦,会降低效率,记得后来经过试验,发现是否赋初始值等等操作带来的效率差别,只能在CPU的时钟周期数上察觉出来,人很难感觉到。