2021-11-10

问题描述

引用C++中特有的,具体可分为变量的引用指针的引用
C是不能用引用的

例子

struct SqList//线性表
{
	int data[100];
	int length;
};
struct Node//链表
{
	int data;
	struct SLinknode *next; //类型声明是递归的,这里必须是指针
}SLinkNode;
  1. 变量的引用 &
//初始化线性表
void InitList(SqList &L)
{
	L.length=0;
}
  1. 指针的引用 *&
//1 初始化带头结点的链表
void InitList(SLinkNode *&L)
{
	L=(SLinkNode *)malloc(sizeof(SLinkNode));
	L->next=NULL; 
} 

解释

引用就相当于取了一个别名
头指针在函数外面叫 head,在函数里面叫 L
L操作即对head操作
InitList()函数为动态分配了地址,并将指针nex指空

int main()
{
	SLinkNode *head;
	InitList(head);//函数具体内容参见上文
	/*InitList函数为head分配了地址,并将指针nex指空*/
	return 0;
}

解决

以顺序串为例

1定义结构体

struct  String
{
	char data[100];
	int length;
}; 

2 串赋值运算算法

C操作

 //对指针进行操作,改变的是指针指向的内容
void StrAssign(String *S,char s[])  
{
	int i=0;
	while(s[i]!='\0')                   
	{
		S->data[i]=s[i];
		S->length++;
		i++;
	}
	S->data[i]='\0';
}

C++操作

//对变量进行操作
void StrAssign(String &S,char s[])
{
	int i=0;
	while(s[i]!='\0')
	{
		S.data[i]=s[i];
		i++;
	}
	S.length=i;
}

函数里面C和C++的操作很好改 但是关键是主函数中的
在这之前要弄懂一个概念 指针的地址指针指向的地址
声明指针时 会自动分配指针的地址指针指向的地址是空的,此时对指针进行操作是很危险的。所以C中操作如下

2021-11-10_第1张图片

对比一下C++中的操作
2021-11-10_第2张图片

当然对于结构体来说C操作不用指针也能完成上述操作
结构体可以直接用等号进行赋值

String StrAssign(char s[])
{
	String temp;
	int i=0;
	while(s[i]!='\0')
	{
		temp.data[i]=s[i];
		i++;
	}
	temp.length=i;
	return temp;
}
int main()
{
	char str1[100];
	scanf("%s",&str1);
	String S;
	S=StrAssign(str1);
	
}

以带头结点的链表初始化为例
要用到指针的指针,C操作如下

typedef struct Node
{
	int data;
	struct SLinkNode *next;	
}SLinkNode; 
void InitList(SLinkNode **L)
{
	*L=(SLinkNode *)malloc(sizeof(SLinkNode));
	(*L)->next=NULL; 
} 
int main()
{
	SLinkNode *head,**temp;
	temp=&head;  //temp指向 head 
	InitList(temp);
}

总结

C和C++虽然很相似,但理清其中的区别能帮助我们更好的理解

你可能感兴趣的:(笔记)