不明白你说的。你最好写段代码来阐述你的问题,因为我个人猜测你把给指针赋值,和修改指针指向的对象(内存)的值搞混淆了。
首先在C/C++里指针变量都是在栈上的吧,不用new的,你要new的是一个对象,然后这个指针变量指向这个new出来的对象爱那个
你应该是想说.直接定义一个指针变量a不new一个对象给他,然后你直接给*a赋值,这时候会发生异常.是这个意思吗?
int* a=new int;
*a=1;
cout<<*a; //正确(new的指针可以直接赋值,不用先指向哪个变量;)
——————————————————————————————————————————————
int* b;
*b=1;
cout<<*b; //报错
int c;
int* b=&c;
*b=1;
cout<<*b; //正确(但是对于一般的指针(不用new定义的),只能在指针指向另一个变量后,才能赋值给*a,是这样的吗?)
@Neverland1995:
可以看出来你对指针的概念不是很明确.
int* a 是声明和定义了一个指针变量a这个指针变量用来指向一个int类型的值
int a 是定义了一个int类型的变量.
正确的地方本来就是正确的,我给你讲下错的
int* b;
*b=1;
cout<<*b; //报错
错误并不是在第三句才发生,其实在第二句的时候已经发生错误了.而且是致命错误,
当int* b的时候,指针b会有一个值,这个值是未知的,但一般都是指向0,当你*b=1时会修改b指向的内存位置
但这个内存位置是未知的,也就说你把某个未知的内存空间给改了.这是非常非常危险的.
当然地3句报错是因为b指针的值有问题
@吴瑞祥:
指针是指向一个内存空间,当这个空间正常时,才能给这个空间赋值
指针变量其实就是一个整型变量,整型的值对应内存中的一个位置.
@吴瑞祥: 谢谢,我明白了!再请教一个问题:那为什么字符串可以呢?
char *b;
b="aaaa";
cout<<b;
@Neverland1995:
你这是b=不是*b=
@吴瑞祥: 嗯嗯,谢谢!
唉,用java或c#比较多,好多概念忘记了。。。
先给说下个基础吧。
1. 我们在使用内存时,必须先向内存申请使用空间。
2. 指针简单点说就是一个“存储某个内存空间的首地址的变量“。
所以你建一个指针,你没给他设置指向的内存地址,他也不知道指到哪里去,怎么对那部分内存进行操作?
普通变量本身就已经内存中申请了使用空间,所以指针指向他当然没问题,你通过指针给变量赋值时,实际上就是对那部分内存空间进行赋值。
那为什么new可以直接赋值?因为new这操作符在使用时,会在内存中申请一部分使用空间,之后返回那部分空间的首地址。这个返回的首地址就是个指针啊。
”char* b;“ 这样的空指针,他都不知道指到到哪个内存空间,你怎么对 *b 进行赋值?
综上所述,你的问题是对的。
ps1:我在使用指针时,更喜欢把指针看成一个特殊的变量 ”char* b“ ,这样 b 不就是一个类型为 char* 的变量,这样理解指针好多了。
ps2:”char* b“这种写法是错的,当我们声明一个空指针时必须严格说明他是一个空指针,上面说了指针是”存储某个内存空间的首地址的变量“,如果我们没给 b 设置初始值,编译器是会随便给他一个值,这样我们就不知道他到底是指向哪个内存空间,使用时可能会超出我们的期望。所以定义一个空指针必须这样写:
char* b = 0;