- 链表抽象结构解析
- 引用、解引用、指针、链表赋值取值
链表抽象结构解析
typedef struct LNode
{
Book data;
struct LNode *next;
}LNode,*LinkList;
LNode e;
LNode *p = &e;//创建一个指针变量p,指向结构体的实例对象
p->data = 100;//通过"->"的方式来向指针变量指向的结构体的具体内容赋值
//e->data = 50;//结构体自身是不支持这种指向的
(*p).age = 200;//*p直接取其指向的对象,此时也就相当于结构体e了,因此可以直接通过点语法进行赋值
LNode e = (*p);//直接取出指向的对象,赋值给e
引用、解引用、指针、链表赋值取值
int a = 1;
int *p1 = &a;//int *p1表示创建了一个指针变量p1,*表示p1是一个指针变量,
//int表示该指针变量指向的对象的类型;&表示取a的内存地址。
//将a的内存地址赋给指针变量p1的指向对象地址空间,
//或者说,让指针变量p1指向a。
int b = *p1;//右侧代表的是直接取出指向的对象,赋值给b,b=a
引用:它用来给一个对象提供一个替代的名字。引用是别名,不用重新开辟空间
&(取地址操作符)
*(解引用操作符)
*表示指针,**表示指针的指针。
若定义LinkList L,则L为单链表的头指针,若定义LNode p,则p为指向单链表中某个结点的指针,用p代表该结点。当然也可以使用定义LinkList p,这种定义形式 完全等价于LNode *p。
指针变量p:表示结点地址。
结点变量(*p):表示一个结点(数据元素也叫结点,是数据的基本单位)。
&和 * 为互补运算。
L->data==(*L).data
L完全等于&(*p)
L完全等于p
#include<iostream>
using namespace std;
void main(){
int a=1;
int *b;
b=&a;//a的引用赋值给b
cout<<(*b)<<endl;//解引用b,输出1
int i=5;
int &j=i;
i=7;
//j是一个引用类型, 代表i的一个替代名
//i值改变时,j值也跟着改变,所以会输出i=7 j=7
cout<<"i="<<i<<"j="<<j;
//解引用操作符是:*。对于其定义书上并没有给出明确的定义,
//不过其意思是对其得到操作数(必须为指针类型)所指变量的引用。
//如有如下代码:
int ival;
int *ip=&ival;
int &iref=*ip;//*ip就是ival的引用。
//其等价于
int &iref=ival;
//的确,解引用是很好的说法。
//一般说*是“取值”符号,对应的&是取地址符号,
//但是,如果对一个结构的指针用*号,那还叫成取值就说不通了。
struct foo a;
struct foo * p = &a:是定义p为a的指针
struct foo & b = a;就是声明b为a的引用
//用p时要用->符号,或(*p).xxx来取成员
//用b的话,就直接b.xxx来取成员
}