指针和指针变量的关系
- 指针就是地址,地址就是指针。
- 地址就是一个内存单元的编号,如1001 (地址值(简称地址)不可以是小数,也不可以是负数)。
- 指针变量就是存放内存地址的变量。
指针和指针变量是两个不同的概念,但要注意的是,通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。
p、*p 和 &p的区别
-
* 取值运算符
-
& 取地址运算符
p是指针变量,它存储的是另一个同类型变量的地址
*p表示p所指向的变量的值(即p存放地址对应变量的值。如下图,p存放的是变量i
的地址,那么*p
取的就是变量i
的值)。所以*p
等价于a,即*p
=a
&p表示指针变量p本身的地址(注意指针变量的地址和指针变量的值的区别。如下图,指针变量p的值是变量i的地址;指针变量p的地址是其所在内存存储单元的地址)。所以p等价于&a,即p = &a 或 &a = p
如下图中,1001是指针变量p的地址,1007是变量i的地址。指针变量存放的是变量i的地址,也就是指针变量的值。所以p=1007,*p=5,&p=1001
注意:p是指针变量,存放的是地址(内存单元的编号)。
注意:*p表示的是数据值,即p指针指向地址的内容。
- 不能给
*p
赋地址值,如*p
= &i; 这是错误的,无法通过编译; *p
表示的是数据值,所以只能赋数据值。如*p
= 100;或将地址值 &i 强转成数据值,如*p
= (int)&i;
星号*的用途
p是指针变量,*表示这是一个指针,int表示该指针变量所指向的数据的类型。 定义指针变量时的*
和 使用指针变量时的*
意义完全不同。。
-
指针定义中的
*
,表示定义一个指针变量。(如int *p;表示定义一个int类型的指针变量) -
使用指针变量时的
*
,表示取值运算符。(如*p,表示获取指针变量p指向地址的内容)
int *p; 和 int **p; 解析
-
int *p;表示定义一个指向int类型的指针变量p
-
int **p; 表示定义一个指向int *类型的指针变量
引用
局部变量(方法内的变量),在方法执行完毕后,就会被释放。
-
fun1()和fun()2没有修改指针变量L的内容
-
fun()3是传引用调用,会修改实参的内容。&L表示取指针变量L的地址,拿到指针变量L的地址,就可以修改变量的内容了
什么是引用?
- 引用是一个变量的别名,本身不单独分配自己的内存空间,而是与该变量共享一块内存空间。所以可以通过引用来修改变量的值。如下图的L3和L共享一块内存空间,可以通过L3来修改L的内容。