面试笔记1(数组)

本文详细解析了C++中基本类型和复合类型的内存分配方式,包括字符、指针、整型、浮点型等数据类型的字节数,并深入探讨了内存分配区域、数组、函数体内/外定义的数组初始化、字符串处理、多维数组声明、指针数组与数组指针等关键概念。此外,还介绍了如何解决特定问题,如数组长度超过一半的数字查找。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开始:

c++内置类型分为两组:基本类型和复合类型。复合类型有:数组、字符串、指针、引用、结构体和共用体。

总结:char *  字节数不一样。还有long的字节数不一样,其他都一样。

32位编译器:跟编译器有关。

      char :1个字节
      char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
      short int : 2个字节
      int:  4个字节
      unsigned int : 4个字节
      float:  4个字节
      double:   8个字节
      long:   4个字节
      long long:  8个字节
      unsigned long:  4个字节

  64位编译器:

      char :1个字节
      char*(即指针变量): 8个字节
      short int : 2个字节
      int:  4个字节
      unsigned int : 4个字节
      float:  4个字节
      double:   8个字节
      long:   8个字节
      long long:  8个字节
      
unsigned long:  8个字节

内存分配:

全局(静态存储区)存放全局变量和静态变量。包括DATA段(全局初始化区)和BBS段(全局未初始化区)程序结束后由系统释放。

文字常量区,存放常量字符串

程序代码区,存放函数体的二进制代码


1.数组定义中类型不能是引用,即没有引用数组,这是因为引用是不能赋值的,而数组中的元素时可以被赋值。

 虽然没有引用数组,但是数组可以引用。  int  (&P)【6】=a    引用必须初始化。

2.函数体外定义的内置类型数组,初始化为0,函数体内定义的内置类型数组,元素无初始化,若初始化部分元素,则后面的初始化为0.

3.要动态声明一维数组。

int  *a = new  int【n】

释放   delete   【】a   

4.为了兼容C语言,C++所有的字符串常量都由编译器自动在末尾添加一个空字符null

c风格字符串末尾必须有一个字符\0

包括字符串常量和末尾添加了\0的字符数组

5 C/c++中有很多字符串处理函数,传递给这些标准库函数例程的指针必须具有非零值,并且指向仪null结束的字符数组。

6.在声明多维数组时,第一维数字可以省略。

7.数组在初始化时,用花括号进行多维的赋值,不能用(),否则进入里面单独运算,整个表达式的值,是最后一个表达式的值。

8.int  **a=new  int * [m]

声明一个二维数组,也就是声明一个指针数组。   int *[m]类型是一个指针数组类型。

9.const  * p  指针指向一个常量,指针指向的数值不能通过指针修改。

和* const  p   常量指针。指针保存的值不能修改

10.指针数组,是一个数组里面装着指针。   int  *a[10]  

数组指针   是一个指向数组的指针。   int (*P)[10]

11.char *p= "hello"  p指向的是位于文字常量区的字符串,是不允许修改的,修改也不知道改什么地方。

12.数组的首地址是常量,不可以变更。不能对首地址a进行一些加减操作。

13.再次理解二位数组

int a[4][5]

a是包含四个元素的数组,每个元素都是由5个整数组成的数组。

&a 表示数组的首地址。类型为   int(*) 【4】【5】

a 类型为 int * 【5】  a为指向数组a第0个元素 a[0]的指针。

*a或a[0] 类型为int *           指向  数组a[0]的首元素a00 的指针。

14 .在考察多级指针的时候,一定要明确指针指向的是什么,才能知道它加1后跳过多少字节。

int  a[2][3][4]

则&a的类型是     int  (*&a)【2】【3】【4】

显然  &a的类型是  int  (*)[2][3][4]   加1则相当于跳过整个数组。

15.线性表是一种逻辑结构。

 顺序表和链表是一种存储结构。

线性表中元素的位序是从1开始的,而数组中元素的下标是从0开始的。

16.对称矩阵的压缩,要包括对角线,及对角线以上的元素。

17.只有宏替换来定义数组的长度。

18.int在64位系统中占4个字节。

19.数组中一个数字的出现超过了数组长度的一半,请找出这个数。

解答:
这个数字出现的个数大于其他全部出现个数之和。

如果每次删除两个不同的数的话,最后剩余的一定是那个数字。

a.初始化,设当前的数组为data[],数组的长度为n,current=data[0];curretnum=1

b.设置i,遍历整个数组。

c.当下一个data[i]与current相同时,就将currentnum++,就是把这个数字的个数加1.

d如果不同,则currentnum--,如果数字删除干净,则current=当前的data[i]

e当i=数据长度时,就输出current,如果不等于就继续i++;

(这里最坏的情况,是每个数都与那个数进行一次比较,但是仍旧是那个数剩下,其他情况,当然也是他剩下。

如果这个数减少到0的话,就换成下一个数。之前的数因为比较过了,就相当于删除掉了)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值