广州市住房和城乡建设委员会网站6长沙的seo网络公司
1 C++中指针与引用的区别
引用相当于起别名
int m;
int &n = m;
n 相当于 m 的别名(绰号),对 n 的任何操作就是对m的操作。
所以 n 既不是m的拷贝,也不是指向 m 的指针,其实n就是 m 它自己。
引用的注意事项:
1 引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)
2 不能有 NULL 引用,引用必须与合法的存储单元关联(指针则可以是 NULL)
3 一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)
例如:
int i = 5;
int j = 6;
int &k = i;
k = j; //将k和i的值都变为了6
语句 k = j 并不能将 k 修改成为 j 的引用,只是把k的值改变成为 6。
由于 k 是 i 的引用,所以i的值也变成了 6。
引用的主要功能是传递函数的参数和返回值。
C++ 语言中,函数的参数和返回值的传递方式有三种:值传递、指针传递和引用传递。
1 值传递:
void Func1(int x)
{ x = x + 10;
}
...
int n = 0;
Func1(n);
cout << "n = " << n << endl; // n = 0
2 指针传递:
void Func2(int *x)
{ (* x) = (* x) + 10;
}
...
int n = 0;
Func2(&n);
cout << "n = " << n << endl; // n = 10
3 引用传递:
void Func3(int &x)
{ x = x + 10;
}
...
int n = 0;
Func3(n);
cout << "n = " << n << endl; // n = 10
x 和 n 是同一个东西,改变 x 等于改变 n
2 C++指针的引用*&
如果想:在一个函数中修改指针的指向,并且在退出函数后这种操作保留,就需要使用指针的引用
#include <iostream>
using namespace std;struct point {int x;int y;
};void changenum1(point *&pnum) { //point *&pnum表示指向point类型的指针的引用,即point*类型变量的引用pnum = new point;pnum->x = 4;
}void changenum2(point *pnum) {pnum = new point;pnum->x = 4;
}void test1() {point *num = new point;num->x = 10;changenum1(num);std::cout << "指针引用" << num->x << endl;
}void test2() {point *num = new point;num->x = 10;changenum2(num);std::cout << "指针" << num->x << endl;
}int main() {cout << "开始执行程序" << endl;test1();test2();cout << "执行程序完毕" << endl;return 0;
}
point *&pnum:
表示指向point类型的指针的引用(即point* 类型变量的引用)point *&pnum = point* &pnum(比较好理解)
3 题目
设计在单链表中删除值相同的多余结点的算法
算法:
typedef struct list
{int data;struct list *next;
}LNode;void deleteLike(LNode* &head)
{LNode *p,*q,*s;for(p=head;p!=0;p=p->next){for(q=p->next,s=q; q!=0; )if (q->data==p->data) //删除相同值的节点 {s->next=q->next; free(q);q=s->next;}else{ s=q;q=q->next;}}
}
完整代码:
#include<stdio.h>
#include<stdlib.h>#define N 10typedef struct list
{int data;struct list *next;
}LNode;void deleteLike(LNode* &head)
{LNode *p,*q,*s;for(p=head;p!=0;p=p->next){for(q=p->next,s=q; q!=0; )if (q->data==p->data) //删除相同值的节点 {s->next=q->next; free(q);q=s->next;}else{ s=q;q=q->next;}}
}LNode *creatlist(int *a)
{LNode *h,*p,*q; int i;h=p=(LNode *)malloc(sizeof(LNode));for(i=0; i<N; i++){q=(LNode *)malloc(sizeof(LNode));q->data=a[i]; p->next=q; p=q;}p->next=0;return h;
}void outlist(LNode *h)
{LNode *p;p=h->next;if (p==NULL) printf("\nThe list is NULL!\n");else{printf("\nHead");do {printf("->%d",p->data); p=p->next; } while(p!=NULL);printf("->End\n");}
}int main( )
{ LNode *A; int a[N]={1,3,4,1,10,3,4,8,6,8};A=creatlist(a);deleteLike(A);outlist(A);return 0;
}