C语言指针入门学习、概念梳理(二)

C语言指针入门学习、概念梳理(一)

C语言指针入门学习、概念梳理(二)


地址:内存单元的编号,从零开始的非负整数,范围:4G(0–4G-1))
指针:指针就是地址,地址就是指针,指针变量就是存放内存单元编号的变量,或者说指针变量就是存放地址的变量,指针的本质就是一个操作受限的非负整数,指针不允许相加相乘相除,但可以相减,通俗理解:门牌号相加、相乘除无意义,但可以相减(两房之间隔了几个房间)

int * p 定义的是p而不是*p,未初始化赋值时,系统给p随机分配了一个未知垃圾地址,p代表p指向的垃圾地址中所存放的未知内容(可能是系统中的重要数据,若被更改,系统可能崩溃),故系统无权对p进行读写。

如果定义了一个指针变量p但没有赋值,p所指向的就是一个系统自动分配的垃圾二进制值(存储空间), 所以,为避免系统给未初始化的指针随机分配未知垃圾地址,定义指针时最好赋初始值 int *p = NULL;

# include <stdio.h>
int main(void)
{
    
       
    int * p;
    int i = 5;
    *p = i;  // p指针没有初始化,里面分配的是一个垃圾值,因此*p表示的是以p中的垃圾值为地址的一个单元(即未知单元),将5赋给一 
             // 个未知的单元,此时p的地址不是i的地址,只是*p所指向的未知单元中存储的是i的值而已。
             //程序运行时,相当于用一个5修改了一个本不属于它的单元,因此会报错。
             //应该先将i的地址赋给p,使p指向i,这样*p = i才成立。不报错是因为*p是int型,i也是int型,二者类型一致。
    printf("%d\n", *p);
    return 0;

当一个程序跑起来时,系统给它分配了两块空间,但由于指针的特性,将其他空间给修改了,系统就会报错,若系统检测不出报错,这就是病毒的特性,试想你半夜回酒店,前台给你拿错了门卡,进错了房间,跟人家对象躺一块儿了,这事儿就大了。所以说指针很强大,但同时也很危险,因为权限太大,比如说你写的程序能越过系统把一个不属于它所控制的一个单元的值改写,而不被系统发现,系统就有崩溃的风险,即含有病毒的特征(可以访问、修改、读写一个它不能够访问的单元)。


p取数据,取p指针变量所指向的内存地址中的数据,表示以p的内容为地址的变量 若p没有初始化,系统会分配一个垃圾值给*P,
和普通变量一样,也叫野指针。
void指针与空指针NULL不同,NULL说明指针不知向任何数据,是“空的”;而void指针实实在在地指向一块内存,只是不知道这块内存中是什么类型的数据。

# include <stdio.h>
int main(void)
{
    
    
	int i = 5;
	int *p;
	int *q;
	p = &i;
	//*p = p; //error 语法编译会出错
	//*q = p;   //error: *q代表的是q指向的整型变量,是int整型,而p是指针类型int *,二者不一致,不能赋值
	*q = *p  //error: q没有初始化,地址不确定,故*q是野指针,*p是一个值完全等同于i,把一个值赋值给一个未知的地址显然不合法。
	printf("%d\n", *q);
	return 0;
}

如果你定义了一个指针变量p,若未赋值,p指向的就是一个系统分配的垃圾值地址,但这个垃圾地址可以访问,程序有权利对p所指向的垃圾地址单元进行读写。但p表示的是另一个未知单元,程序无权对p进行读写,如果可以读,那你可能就能获取到其他人的隐私信息。

# include <stdio.h>
int main(void)
{
    
    
	int i = 5;
	int *p;
	int *q;  //q在定义时,系统内存为q开辟空间,此空间属于本程序,程序可以读写q的内容,但由于未进行初始化,q空间内放的是垃圾值(地址),  
	         //而*q等价于这个垃圾值(地址)所指向的变量,此变量不属于本程序,所以不能对*q进行读写打印printf。
	p = &i;
	p = q;  /* error:q本身是垃圾值, 把q赋值给p,p也变成垃圾值。下一行printf函数中*q代表的是一个未知的单元,
	         q本身类型是int * ,但*q类型是int型, *q是一个你无法控制的未知单元,把不属于你的控制单元打印输出
	         了,这是不对的。*/
	       
	printf("%d\n", *q);/*error: q的空间是属于本程序的,所以本程序可以读写q的内容,
	                            但如果q内部是垃圾值地址,*q就是一个以垃圾值为地址的值,则本程序不能读写*q的内容。
	                            因为*q所代表的内存单元的控制权限并没有分配给本程序,简单来说就是,q中确实有地址,但该地址
	                            不是程序分配的,而是因为定义时没有初始化赋值,所以随机分配了一个未知地址,程序无权限对其进行读写
	                            q是指针变量即存放的是地址,q已经被定义了就说明程序可以使用q的分配
	                            空间,但q没有明确的地址指向,所以p指向了一个未被授权的野地址(垃圾地址),即*p无权被改写。*/
	return 0;
}

C语言指针入门学习、知识点梳理(三)

(本人能力有限,博客仅供广大网页参考学习,若有不足之处,还望指正,共同进步。)

猜你喜欢

转载自blog.csdn.net/AII_IIA/article/details/131202861