数据结构基础之——指针的理解
程序员文章站
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变量不是你当前程序拥有的内存单元
无法读取数据,无法输出、无法操作这个内存单元
*/