先说题目指出的三个语句的结果。
*p=&a; 错误写法; p=&a; 正确,把变量a的地址赋给指针p; *p=a; 正确,把变量a的值赋给指针p指向的地址的内容;
来详细看看为什么。
#include <iostream>
using namespace std;
int main()
{
int a=10;
int *p=&a;
cout<<"*p:"<<*p<<endl;
*p=*p+1;
cout<<"*p:"<<*p<<endl;
return 0;
}
其中,int *p=&a; *p就是取变量a的内容,即x=*p ;等价于x=a; 。 &a就是取变量a的地址。
部分初学者可能会有以下的错误赋值想法:
int a=10;
int *p;
*p=&a;
认为 *p 是存放变量a的内容,所以把&a (也就是a的地址)存放在 *p 中啊,而且写法跟上文并无不同,为什么会是错的呢?难道指针必须在初始化阶段赋值?
首先,赋值方法是错误的。
这里有一个盲点。 初学者在学习其他变量时,会注意到声明了什么变量,在之后使用的时候变量名和定义时的变量名是一样的,比如:
int a;
float b;
char c;
a=10;
b=1.01;
c='c';
但是,在指针这里出现了一个与众不同的存在——声明符* ,因此,我们虽然定义了一个写成*p 的指针变量,但在使用的时候并不能把它看成一个不可分割的整体。(一开始学的时候很可能会拐不过弯来)
int *p; 在这里定义了一个int型指针对吧? 但写成这样可能更会让初学者理解——int* p; ——定义了一个指针,指针变量名是p!不是*p !
P.S.以上两种写法是一样的,但是声明符* 最好紧跟着变量名。
要知道,当定义了一个变量,就会开辟一个内存,包括变量的地址和变量的值,而定义的指针也同样,只不过指针变量的值就是要指向的变量的地址。
指针的值叫做指针,他是一个内存地址,是一个数据。 而指针变量是一个空间,他有自己的地址。
至于指针是否需要开辟内存,主要取决于指向的空间本身是否有内存。
现在再来看,p 是我们定义的指针;p=&a; 就是把变量a的地址存在p中;想要通过指针来调用变量a的内容,就使用*p 。
也能看出来*p=&a; 这个明显的错误:这条语句在试图把变量a的地址赋值给变量a的内容!
最后,我们已经知道了是赋值的错误,就不是指针必须在初始化阶段赋值啦!
最近复习数据结构,记录一下有些会混淆/不太清楚的知识点,如果发现有内容错误处,评论指出,教学相长,感激不尽。
|