C/C++ 指针和引用


一、数组

1.数组:一组有序数据的集合。数组中每个元素都属于同一个数据类型。
注:

  • 数组的本质是常指针,即不能再改变地址的指针。
  • 数组的下标从0开始,注意不要数组越界。
  • 不能将一个数组赋给另一个数组(二等公民)。

二、指针

指针是一个值为内存地址的变量,也就是用来存储地址的变量。在大多数系统内部,指针是由无符号整数表示。
1.指针声明

int *p ;   

注:不能简单的将一个整数赋给一个指针(一般只有0才可以)

2.指针初始化

int *p = NULL = 0;         //NULL是特殊的地址0,叫空指针
int *p = &a;               //p初始化为a的地址
int *p = new int();        //申请一个空间给p,c++方式
int *p = (int *)malloc(sizeof(int)) //申请一个空间给p,c方式

对指针执行间接访问前,指针必须进行初始化,或者使它指向现有的内存,或者给它分配动态内存,对未初始化的指针变量执行间接访问操作是非法的。
指针的值(即地址)应属下列4种状态之一:

  • 指向一个对象。
  • 指向紧邻对象所占空间的下一个位置。
  • 空指针,意味着指针没有指向任何对象。
  • 无效指针,也就是上述情况之外的其他值。
    注:声明一个指针变量并不会自动分配任何内存。

3.指针运算(一般涉及数组)
(1)指针与整数的加减运算

p += k;        // 根据类型增加k个sizeof(a[0])

可以把一个整型值加到一个指针上,也可以从一个指针减去一个整型值。在这两种情况下,这个整型值会进行调整,原值将乘以指针目标类型的长度。
对一个指针加1将使它指向下一个变量,至于该变量在内存中占几个字节的大小则与此无关。注意操作合法性。

(2)指针与指针的减法
如果两个指针都指向同一个数组中的元素,那么它们之间可以相减。指针减法的结果经过调整(除以数组元素类型的长度),表示两个指针在数组中相隔多少个元素。如果两个指针并不是指向同一个数组的元素,那么它们之间进行相减就是错误的。

4.特殊指针
(1)空指针(null pointer)
空指针不指向任何对象,在试图使用一个指针之前要检查它是否为空。

int *p = NULL = 0;

(2)void* 指针
void* 是一种特殊的指针类型,可用于存放任意对象的地址。
一个 void* 指针存放着一个地址,这一点和其他指针类似。不同的是,并不知道该地址中是个什么类型的对象。malloc 返回的就是void* 指针。

(3)野指针
即未初始化和非法的指针,将任意数值赋值给指针变量没有意义。

(4)指针常量(pointer constant)
一般指NULL(空指针)。编译器会把变量放在内存中的什么位置。在极少见的情况下,偶尔需要使用指针常量,这时可以通过把一个整型值强制转换为指针类型来创建它。

三、引用

1.引用的概念:引用是对一个变量或常量标识符起的别名。本身地址为引用变量的地址。

数据类型 &引用名 = 变量名; int &ra = a;

注:

  • 创建一个引用时,该引用必须被初始化。所以不能有空引用。
  • 不允许把为一个变量建立的引用重新用作另一变量的别名。
  • 对于 void 和 数组名不可以引用,但是可以对数组的某个元素的引用。
  • 不要返回指向局部变量或临时对象的引用。

2.指针和引用
(1)不同点:

  • 指针和引用对它们所指的或所引用的变量的操作方式不一样。
  • 指针的功能更强大,但同时也更不受控制。
  • 引用则是较高级地封装了指针的特性,它不直接操作内存地址,因而具有较高的安全性,也不易产生由于使用指针而常常产生的那些不易察觉的错误,不失为一种好的选择。

(2)相同点:都可以采用间接操作的手段对某个变量所代表的空间进行访问。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值