指针和引用的比较-以教材程序为例

基础知识:

1 malloc 分配的对象生命周期是allocated类型,不同于常规的局部变量

2 指针p指向某个对象obj, 则*p就是obj的别名,引用.

3 如果要函数f 调用函数g,并且在函数g中改变函数f中的局部变量obj, 应该使用如下形式  g(&obj)

4 参数类型是指针有时是为了读取对象,而不是修改对象,这时候可以使用关键字const

5 外部变量没有3中提到的问题,直接访问即可.

下面以教材例7.8来说明

(一) 不好的例子

教材中的creat虽然可以工作,但是creat的参数head一无所用, 因为只传递一个NULL指针是毫无意义, creat的head和main函数中的全然不相干. 主函数中的head获得链表头是通过return的返回值

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <malloc.h>
struct node { /*节点的数据结构*/
   int num;
   char str[20];
   struct node *next;
};

/* * * * * * * * * * * * * 创建链表函数* * * * * * * * * * * * * * * * */
struct node *creat(struct node *head)
{
   char temp[30];
   struct node *p1, *p2;
   p1 = p2 = (struct node*)malloc(sizeof(struct node));
   printf("input num, name: \n") ;
   printf("exit:double times Enter!\n");
   gets(temp);
   gets(p1->str);
   p1->num = atoi(temp);
   p1->next = NULL;
   while (strlen(p1->str) > 0) {
      if (head == NULL)
         head = p1;
      else
         p2->next = p1;
      p2 = p1;
      p1 = (struct node *)malloc(sizeof(struct node));
      printf ("input num, name: \n");
      printf("exit:double times Enter!\n");
      gets(temp);
      gets(p1->str);
      p1->num = atoi(temp);
      p1->next = NULL;
   }
   return head;
}

/* * * * * * * * * * * * * * 链表输出函数* * * * * * * * * * * * * */
void print (struct node *head)
{
   struct node *temp;
   temp = head;
   printf("output strings:\n");
   while (temp != NULL) {
      printf("%d -- %s\n", temp->num, temp->str);
      temp = temp->next;
   }
   return;
}

/* * * * * * * * * * *主函数 * * * * * * * * * * * * * * * * */
int main(void)
{
   struct node *head;
   head = NULL;
   head = creat(head); /*调用函数创建以head 为头的链表*/
   print(head);/* 调用函数输出节点 */

   return 0;
}

程序的运行:

input num, name:

exit:double times Enter!

11

zhang

input num, name:

exit:double times Enter!

13

li

input num, name:

exit:double times Enter!

14

wang

input num, name:

exit:double times Enter!

output strings:

11 -- zhang

13 -- li

14 -- wang

Press any key to continue

(二) 对(一)的合理修改, 注意creat没有参数了

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <malloc.h>
struct node { /*节点的数据结构*/
   int num;
   char str[20];
   struct node *next;
};

/* * * * * * * * * * * * * 创建链表函数* * * * * * * * * * * * * * * * */
struct node *creat(void)
{
   char temp[30];
   struct node *p1, *p2, *head = NULL;
   p1 = p2 = (struct node*)malloc(sizeof(struct node));
   printf("input num, name: \n") ;
   printf("exit:double times Enter!\n");
   gets(temp);
   gets(p1->str);
   p1->num = atoi(temp);
   p1->next = NULL;
   while (strlen(p1->str) > 0) {
      if (head == NULL)
         head = p1;
      else
         p2->next = p1;
      p2 = p1;
      p1 = (struct node *)malloc(sizeof(struct node));
      printf ("input num, name: \n");
      printf("exit:double times Enter!\n");
      gets(temp);
      gets(p1->str);
      p1->num = atoi(temp);
      p1->next = NULL;
   }
   return head;
}

/* * * * * * * * * * * * * * 链表输出函数* * * * * * * * * * * * * */
void print (struct node *head)
{
   struct node *temp;
   temp = head;
   printf("output strings:\n");
   while (temp != NULL) {
      printf("%d -- %s\n", temp->num, temp->str);
      temp = temp->next;
   }
   return;
}

/* * * * * * * * * * *主函数 * * * * * * * * * * * * * * * * */
int main(void)
{
   struct node *head;
   head = creat(); /*调用函数创建以head 为头的链表*/
   print(head);/* 调用函数输出节点 */

   return 0;
}

(三) 不通过函数返回head, 直接传入修改

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <malloc.h>
struct node { /*节点的数据结构*/
   int num;
   char str[20];
   struct node *next;
};

/* * * * * * * * * * * * * 创建链表函数* * * * * * * * * * * * * * * * */
void creat(struct node **head)
{
   char temp[30];
   struct node *p1, *p2;
   p1 = p2 = (struct node*)malloc(sizeof(struct node));
   printf("input num, name: \n") ;
   printf("exit:double times Enter!\n");
   gets(temp);
   gets(p1->str);
   p1->num = atoi(temp);
   p1->next = NULL;
   while (strlen(p1->str) > 0) {
      if (*head == NULL)
         *head = p1;
      else
         p2->next = p1;
      p2 = p1;
      p1 = (struct node *)malloc(sizeof(struct node));
      printf ("input num, name: \n");
      printf("exit:double times Enter!\n");
      gets(temp);
      gets(p1->str);
      p1->num = atoi(temp);
      p1->next = NULL;
   }
}

/* * * * * * * * * * * * * * 链表输出函数* * * * * * * * * * * * * */
void print (struct node *head)
{
   struct node *temp;
   temp = head;
   printf("output strings:\n");
   while (temp != NULL) {
      printf("%d -- %s\n", temp->num, temp->str);
      temp = temp->next;
   }
   return;
}

/* * * * * * * * * * *主函数 * * * * * * * * * * * * * * * * */
int main(void)
{
   struct node *head = NULL;
   creat(&head);/*调用函数创建以head 为头的链表*/
   print(head);/* 调用函数输出节点 */

   return 0;
}

(四) 使用引用代替指针,明显之处就是不用*head了。

void creat(struct node **head) ==> void creat(struct node * &head)

如果使用typedef struct node *  PNODE, 则

void creat(PNODE*head) ==> void creat(PNODE &head)  视觉效果更佳

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <malloc.h>
struct node { /*节点的数据结构*/
   int num;
   char str[20];
   struct node *next;
};

/* * * * * * * * * * * * * 创建链表函数* * * * * * * * * * * * * * * * */
void creat(struct node * &head)
{
   char temp[30];
   struct node *p1, *p2;
   p1 = p2 = (struct node*)malloc(sizeof(struct node));
   printf("input num, name: \n") ;
   printf("exit:double times Enter!\n");
   gets(temp);
   gets(p1->str);
   p1->num = atoi(temp);
   p1->next = NULL;
   while (strlen(p1->str) > 0) {
      if (head == NULL)
         head = p1;
      else
         p2->next = p1;
      p2 = p1;
      p1 = (struct node *)malloc(sizeof(struct node));
      printf ("input num, name: \n");
      printf("exit:double times Enter!\n");
      gets(temp);
      gets(p1->str);
      p1->num = atoi(temp);
      p1->next = NULL;
   }
}

/* * * * * * * * * * * * * * 链表输出函数* * * * * * * * * * * * * */
void print (struct node *head)
{
   struct node *temp;
   temp = head;
   printf("output strings:\n");
   while (temp != NULL) {
      printf("%d -- %s\n", temp->num, temp->str);
      temp = temp->next;
   }
   return;
}

/* * * * * * * * * * *主函数 * * * * * * * * * * * * * * * * */
int main(void)
{
   struct node *head = NULL;
   creat(head);/*调用函数创建以head 为头的链表*/
   print(head);/* 调用函数输出节点 */

   return 0;
}
时间: 2024-10-06 00:16:24

指针和引用的比较-以教材程序为例的相关文章

c++指针与引用问题

本来是回答问题的,到这里做个笔记 *&L是指针的引用,实参是个指针.所以L是实参指针的别名,对别名L的修改,等于对实参的修改.*L是传值,你无法改变传过来的实参指针变量的值程序代码: #include<iostream>using namespace std;void foo(int*p);int main(){    int a=5;    int *b=&a;    printf("%d %d\n",b,*b);    foo(b);    printf

(C/C++)区别:数组与指针,指针与引用

1.数组跟指针的区别 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变. 指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存.指针远比数组灵活,但也更危险. 数组和指针特点的简单比较: 数组 指针 保存数据 保存地址 直接访问数据 间接访问数据,先取得指针的内容,然后以它为地址取得数据 用于存储数目固定且类型相同的数据 通常用于动态数据结构 编译器自动分配和删除

指针和引用的区别(More Effective c++ )

指针与引用看上去完全不同(指针用操作符"*"和"->",引用使用操作符". " ),但 是它们似乎有相同的功能.指针与引用都是让你间接引用其他对象.你如何决定在什么时候 使用指针,在什么时候使用引用呢? 首先,要认识到在任何情况下都不能使用指向空值的引用.一个引用必须总是 指向某些 对象 .因此如果你使用一个变量并让它指向一个对象, 但是该变量在某些时候也可能不指向 任何 对象,这时你应该把变量声明为指针,因为这样 你可以赋空值给该变量.相

指针与引用的区别

相同点: 1.     指针与引用都是地址的概念.指针指向一块内存,指针的内容是所指向内存的地址:而引用则是某块内存的别名. 2.     引用在语言内部用指针实现. 3.     一般把引用理解为指针,不会犯严重语义错误.引用操作可以看做是受限的指针(仅允许取内容操作). 不同点: 1.     指针逻辑上是独立的,可以改变指针的内容,也可以改变指针指向的内存中的内容:而引用只是一个别名,在逻辑上不上独立的,它的存在具有依附性,必须在声明时就初始化,而且引用的对象在整个生命周期中时不能被改变的

指针与引用的区别以及引用的三种用法

1.指针与引用的区别: 指针是一块内存的地址值,而引用是一块内存的别名. 下面引自:http://www.cnblogs.com/kingln/articles/1129114.html 从概念上讲.指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变. 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一

浅谈C++中指针和引用的区别

指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的地址. 而下面2句定义了一

C++_系列自学课程_第_8_课_指针和引用_《C++ Primer 第四版》

C语言最富有迷幻色彩的部分当属指针部分,无论是指针的定义还是指针的意义都可算是C语言中最复杂的内容.指针不但提供给了程序员直接操作硬件部分的操作接口,还提供给了程序员更多灵活的用法.C++继承这一高效的机制,同时引入了另一个与指针相似但不相同的机制: 引用. 一.引用 简单的来说,引用就是变量的别名(alias), 通过别名我们可以操作引用代表的变量. 定义一个引用的语法如下所示: 变量类型   &引用标识符 = 变量名. Exp: int iVar=10; int &iRef = iVa

转 浅谈C++中指针和引用的区别

浅谈C++中指针和引用的区别 浅谈C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a

C++ 浅谈C++中指针和引用

浅谈C++中指针和引用的区别 指针和引用在C++中很常用,但是对于它们之间的区别很多初学者都不是太熟悉,下面来谈谈他们2者之间的区别和用法. 1.指针和引用的定义和性质区别: (1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元:而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已.如: int a=1;int *p=&a; int a=1;int &b=a; 上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单