先让我来一个一个回答你的疑问
为什么b输出不了的?
上面两位仁兄说的也很清楚,
int* b=NULL;
b是一个空指针(这里你顺便可以查一下空指针与野指针的区别),空指针指向一个空地址,一个存在的地址,但是其实是没有实际物理地址映射的
所有用他直接去存内容,程序会崩溃。
明明看上去int* b对应 int* ip,10对应于int i,感觉没什么毛病啊。
这里确实没什么毛病,用指针保存地址去改变其地址指向的内容,这是常用的方法之一(如果学c++,推荐顺便看看引用)
在哪,怎么修改b才能输出。。。
其实解决很简单,让b指向一段可以读写的地址空间,回答你的疑问,在看看我的代码。
为什么a没有初始化就能赋值成功输出,a都不是指针类型啊
a为什么没有初始化就可以成功?尽管a没有初始化,但是a作为一个局部变量,在计算机中是存在.stack,也就是栈空间的,栈空间是可读可写的,而且合法
主要用来保存局部变量的,所有在栈空间的变量也是合法的。
具体的数据存储,你可以查查,例如,.data .text .bss .stack 。.rodata 还有堆空间,例如为什么字符串常量不能修改呢?“123”一个指针后不能修改
也是同样的道理,因为字符常量,及一些你用的常量1,2之类的,也是数据,也需要存储,就存在.rodata区,而。rodata区是只可以读不可以写的,所有
不能修改。至于为什么这样安排,建议你查查冯.诺依曼架构和哈佛架构
如有错误,或者不解,欢迎一起讨论,修改代码在下面
#include <stdio.h>
#include <stdlib.h>
void setint(int*, int);
int main()
{
int a;
setint(&a, 10);
printf("a: %d\n", a);
int* b=&a;//简单省空间,而且不需要额外开销
setint(b, 10);
printf("b: %d\n", *b);
return 0;
}
void setint(int* ip, int i)
{
*ip = i;
}