C/C++中指针、引用、数组、链表的区别

来源:互联网 发布:mac照片占用空间 编辑:程序博客网 时间:2024/04/29 19:25

一、指针与引用的区别

相同点

二者都是地址概念(但指针指向一块内存,它的内容是所指向内存的地址,而引用则指的是内存块的别名);

不同点:

1)指针是一个实体,需要分配内存区域,但值可以为空;

      引用则仅仅是个别名,不需要分配内存区域,且在定义中必须初始化;

2)引用初始化后不可变,指针可变【注解:引用初始化后不可变是指指向的变量地址不可变,而不是指向的变量的值不可变】;

3)指针和引用的(++、--)运算的意义不一样;

4)sizeof(引用)得到的是所指向的变量对象的大小, sizeof(指针)得到的是指针变量的字节数;



二、指针与数组可以替换使用,容易让人产生错觉二者是等价的,那么二者到底有什么区别呢?

数组:在静态存储区被创建或者在栈上被创建,数组名对应着一块内存(而不是指向),其地址与容量在生命期内保持不变,且数组的内容可以改变;

指针:可以随时指向任意类型的内存块,“可变”,所以指针更加灵活但也更加危险;


数组:用标准库函数strcpy进行复制,而不能使用b=a直接复制这将产生编译错误

指针:可以直接p=q,即将q的地址直接赋给了p


数组:sizeof(a)得到数组的容量

指针:sizeof(*p)得到指针变量的字节数,而不是指针p所指向内存的容量

char a[] = "hello world";char *p  = a;cout<< sizeof(a) << endl;   // 12字节cout<< sizeof(p) << endl;   // 4字节


三、数组与链表的区别

二者都属于一种数据结构,从逻辑结构来看

1)数组必须事先定义确定长度,不能适应数据动态增减空间(当数据增加时可能超出原申请的空间大小,当数据减小时存在空间浪费);但数组的优点就是可以根据下标直接访问对应元素;

2)链表动态地进行存储分配,可以适应动态的增减空间,但一个结点需要一个额外空间存储next指针指向下一个元素;链表的优点是可以方便的插入、删除元素;

从内存存储来看

1)(静态)数组从栈中分配空间,对于程序员方便、快速,但自由度小;

2)链表从堆中分配空间,自由度大但是申请管理比较麻烦;


0 0