给你仔细分析下哈:
首先,指针p是个二重指针,说白了就是它的值是另外一个int型指针变量的地址
截止到你问的那行,现在我们已知a的值是100,假设a的地址是0x1290F54C,pt的地址是0x7FCA6513,pt的值未知(野指针,值是什么都有可能),p也是野指针
如果没有你注释的那一句,*p意味着要取p指向变量的内容,刚刚说了,p是野指针,那么给野指针取内容当然要崩溃
怎么让p不是野指针呢?先给p赋值就行了,但是要记住,p是二重指针,指向的类型必须是某个int指针的地址,所以初始p就这么写:p=&pt;
你就记住,指针本质上就是整型变量,只不过它里面的整数代表地址,可以取对应地址的内容。
而且,如果你想输出a的值printf("%d\n",*p);是不行的,这个输出的是a的地址的10进制形式。
输出a的值应该是printf("%d\n",**p);
输出地址最好用16进制printf("%x\n",*p);
首先,指针p是个二重指针,说白了就是它的值是另外一个int型指针变量的地址
截止到你问的那行,现在我们已知a的值是100,假设a的地址是0x1290F54C,pt的地址是0x7FCA6513,pt的值未知(野指针,值是什么都有可能),p也是野指针
如果没有你注释的那一句,*p意味着要取p指向变量的内容,刚刚说了,p是野指针,那么给野指针取内容当然要崩溃
怎么让p不是野指针呢?先给p赋值就行了,但是要记住,p是二重指针,指向的类型必须是某个int指针的地址,所以初始p就这么写:p=&pt;
你就记住,指针本质上就是整型变量,只不过它里面的整数代表地址,可以取对应地址的内容。
而且,如果你想输出a的值printf("%d\n",*p);是不行的,这个输出的是a的地址的10进制形式。
输出a的值应该是printf("%d\n",**p);
输出地址最好用16进制printf("%x\n",*p);
错误处:*p = &a;
你的int **p; 正如楼上所讲的那样,p没有指向一个空间。
1)比如:
int *pt;
*pt = 10;
这个你可能一看就知道错了。因为pt没有开辟空间。*pt为在这个空间里面存东西。
2)再如:
int a = 10;
int **p;
*p = &a;
这个不是一样的原理吗?*p在这个空间里面存东西合理吗?
没有语句p=&pt;
导致指针p始终是一个野指针,其指向的是一个随机的空间地址,对这个地址的内容进行修改,当然会导致问题
亲测没这句也是可以的,不过是你输出的时候少了个*号,导致输出的是地址值而不是100这个数。#include
int main()
{
int **p;
int a=100;
*p=&a;
printf("%d\n",**p);
return 0;
}