先说题目指出的三个语句的结果。
*p=&a;
错误写法;
p=&a;
正确,把变量a的地址赋给指针p;
*p=a;
正确,把变量a的值赋给指针p指向的地址的内容;
来详细看看为什么。
#include <iostream>
using namespace std;
int main()
{
int a=10;
int *p=&a; //定义一个(int型)指针变量
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的内容!
最后,我们已经知道了是赋值的错误,就不是指针必须在初始化阶段赋值啦!
最近复习数据结构,记录一下有些会混淆/不太清楚的知识点,如果发现有内容错误处,评论指出,教学相长,感激不尽。