您现在的位置是:首页 > 技术文章网站首页技术文章

[C/C++]数组、指针 & 引用

  • WangYe
  • 2020-09-05 13:40:33
  • 486 次阅读
了解 C/C++ 中数组 指针 引用

1. 指针和引用的区别

相同点:

    1). 都是地址的概念;

    2). 都是“指向”一块内存。指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名;

    3). 引用在内部实现其实是借助指针来实现的,一些场合下引用可以替代指针,比如作为函数形参。

不同点:

    1). 指针是一个实体,而引用(看起来,这点很重要)仅是个别名;

    2). 引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;

    3). 引用不能为空,指针可以为空;

    4). “sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;

    5). 指针和引用的自增(++)运算意义不一样;

    6). 引用是类型安全的,而指针不是 (引用比指针多了类型检查)

    7). 引用具有更好的可读性和实用性。


2. 引用占空间吗?

引用取地址,其实是取的引用所对应的内存空间的地址。这个现象让人觉得引用好像并非一个实体。但是引用是占用内存空间的,而且其占用的内存和指针一样,因为引用的内部实现就是通过指针来完成的;

比如 Type& name; <===>  Type* const name

int main(void)
{
        int a = 8;
        const int &b = a;
        int *p = &a;
        *p = 0;
        cout<<a; //output 0
    return 0;
}


3. 三目运算符

在C中三目运算符(? :)的结果仅仅可以作为右值,比如如下的做法在C编译器下是会报错的,但是C++中却是可以是通过的。这个进步就是通过引用来实现的,因为下面的三目运算符的返回结果是一个引用,然后对引用进行赋值是允许的;

int main(void)
{
        int a = 8;
        int b = 6;
        (a>b ? a : b) = 88;
        cout<<a; //output 88
    return 0;
}

4. 指针数组 和 数组指针 的区别

    数组指针:是指向数组的指针,其本质为指针;

    如 int (*p)[10],p即为指向数组的指针,()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。数组指针是指向数组首元素的地址的指针,其本质为指针,可以看成是二级指针

类型名 (*数组标识符)[数组长度]

    指针数组:则是指该数组的元素均为指针;

    其中一维指针数组的定义形式如下。指针数组中每一个元素均为指针,其本质为数组。如 int *p[n], []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]…p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值

类型名 *数组标识符[数组长度]


文章评论 (0)



Top