欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构基础之——指针的理解

程序员文章站 2022-07-14 19:56:37
...
#include<stdio.h> 
int main()
{
	//对应野指针: 
	int* q;//野指针,我是拥有这个单元的,可以读取这个单元的内容 
	int* f;//但这个内容是该单元中本身的垃圾值。 
	int* k;//单元地址是我可以拥有的,内容是垃圾值 
	int* g;//但是若(*指针变量),那么就表示一个普通变量(内存单元) 
	int* t;//并且这个内存单元,不属于本程序所拥有的单元。
	       //不能对*p这个未知的单元进行访问读写操作。 
	
	//对应已经赋值的指针:(有明确指向的指针) 
	int* p;
	int i=3;
	p=&i;
	
	printf("%d\n",p);//p的值,本身存在的垃圾值 
	printf("%p\n",p);//p的地址,本身地址 
	
	printf("%d\n",i);//i的值 
	printf("%p\n",i);//i的地址 
	
	printf("%d\n",*p);//*p的值,p已经赋值,则*p等价于i,所以输出3 
	printf("%p\n",*p);//*p的地址,*p等价于i ,所以相当于输出i的地址 
    
	printf("*************************************************\n");	
	
	//野指针   探究指针变量的地址,空间中保存的值, 
	printf("%p\n",q);
	printf("%p\n",f);
	printf("%p\n",k);
	printf("%p\n",g);
	printf("%p\n",t);
	
	printf("%d\n",q); 
	printf("%d\n",f);
	printf("%d\n",k);
	printf("%d\n",g);
	printf("%d\n",t);
	
	printf("*********************************************\n");
	
	//野指针   探究*P的地址,空间中保存的值
	//实际上,野指针的*p(是一个你不知道的内存单元)
	//且不属于本程序拥有的内存单元,无法读写操作 
	//同时,一般编译软件不会报错,但是会屏蔽掉,切断这些语句 
	printf("%p\n",*q);
	printf("%p\n",*f);
	printf("%p\n",*k);
	printf("%p\n",*g);
	printf("%p\n",*t);
	
	printf("%d\n",*q);  
	printf("%d\n",*f);
	printf("%d\n",*k);
	printf("%d\n",*g);
	printf("%d\n",*t);
	
	return 0;
}

/*总结: 
1.不管是野指针还是真指针,地址是其本身的地址,值也是本身存在的垃圾值
2.对于*指针变量(*p)(其实*p也是个变量)(以p的内容为地址的变量)
则情况不同
(1)真指针:地址是先前赋值那个变量的地址,
			值是先前赋值那个变量的值 
		    即:*p完成等同于i;
		
 (2)  野指针:地址是本程序之外的地址,(一个不知道的内存单元) 
			值是本程序之外对应地址里面的值(一个不知道的值) 
			地址和值是多少你是不知道的)
			(因为你无法访问)或无权限访问,进行读写操作
		即:野指针的*p变量不是你当前程序拥有的内存单元
		无法读取数据,无法输出、无法操作这个内存单元 
				 
*/