【C++基础部分】指针和数组有什么区别?不同类型的指针本身大小是一样的吗?怎么确定一个指针的大小?

本问题对应文章链接:C++常见面试题整理

共以下 2 个回答

  • Thaddeus 永久会员 2023年8月13日 下午8:40
    1、指针和数组的区别

    (1.)定义:指针是一个变量,存放某一个变量的地址;数组是类型相同、数目固定的若干个变量的有限集合(一个容器),它存放的是数据。
    (2.)内存分配方式:指针本身是一个变量,存储地址信息,在程序运行时,可以指向不同的内存位置;数组是内存中连续分配的一段存储空间,其大小在编译阶段就确定了。
    (3.)大小:所有类型指针的大小都是一致的,指针大小只与操作系统和编译器有关;数组的大小是固定的,在编译时分配内存,数组中每个元素的类型和大小均相同,使用sizeof可以计算出数组的大小。
    (4.)访问数据的方式:指针是通过解引用操作符 * 间接访问数据, * 后面就是想访问的地址空间中的数据;数组直接访问数据,通过下标。
    (5.)数组名的特殊性:数组名是数组第一个元素的地址,因此数组名又称为指向数组的指针,且是一个常量;而且有一个概念为:数组退化为指针,即在 C++ 中,数组在作为函数参数时会退化为指向其⾸元素的指针。


    2、不同类型的指针本身大小是一样的吗?

    答:是一样的。在C/C++中,所有类型的指针大小都是一致的(4字节或者8字节),指针的大小只与操作系统和编译器有关,32位系统指针大小是4字节,64位系统是8字节。
    (1.)操作系统:影响指针大小的实际上是寻址空间的大小。在32位系统中,寻址空间是2^32,因此4字节的指针大小就可以足够表示所有内存地址,而在64位系统中,寻址空间是2^64,因此需要更多的位数来表示内存地址,所以指针大小为8字节。
    (2.)编译器:编译器可以根据处理器的位数将高级语言代码转换成可以在该处理器上运行机器码。例如处理器是32位架构,编译器就会将指针大小设置为4字节。


    3、怎么确定一个指针的大小

    答:使用sizeof运算符。sizeof(指针类型),例如sizeof(int*)。

    0 赞同 0 条回复
  • mpweixin用户 永久会员 2023年7月3日 下午10:11

    指针和数组的区别:

    1. 大小:数组在编译时就分配内存空间,分配的大小等于数组的大小和数组中每位存储的元素所占字节的乘积;而指针的大小就是根据平台和编译器确定,通常是固定大小的字节,都可以通过sizeof()关键字来计算;
    2. 数据类型:数组是一种数据类型,是一种存储数据的“容器”,而指针是变量类型,用于存储另一个变量的一块地址;
    3. &取地址:数组名取地址得到的是数组名所指元素地址(数组首地址),对指针取地址得到的是指针变量自身的地址;
    4. 访问数据的方式:指针间接访问数据,将指针的内容作为地址,从该地址中提取数据,而数组直接访问数据;
    5. 内存布局:数组在内存中是连续存储的,元素紧密排列。而指针只是存储另一个变量的地址,它本身并不保存其他连续的元素。

    如何确定一个指针的大小:在C/C++中,指针变量的大小是固定的,它的大小与操作系统和编译器有关,因此在一个系统中,不同类型的指针本身大小是一样的。在32位系统中,指针的大小通常是4字节,在64位系统中,指针的大小通常是8字节。具体的,要确定一个指针的大小,可以通过sizeof运算符来计算,比如sizeof(int*)可以得到对应类型指针在当前平台的大小。

    0 赞同 0 条回复

# 回答此问题

后才能回答