10月8日面试题总结

数组名的知识总结

数组名的本质

数组名可以看成是指向这个数组的首地址的指针,不过它是当做一个地址常量使用,同时,它还可以表示这个数组的长度。

1
2
3
4
5
int a[5];

*a++ //这个是错误的,因为a是地址常量

sizeof(a) = 4 * 5 = 20;

a和&a的区别

&a是整个数组的首地址,a是数组首元素的首地址,其值相同,但是意义不同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;

int main()
{
int a[2] = {1,2};
cout << a <<endl;
cout << &a <<endl;
//相当于:a + 1 * sizeof(int)
cout << a + 1<< endl;
//相当于:a + 2 * sizeof(int),得到的值为最后一个元素的下一个地址
cout << &a + 1 << endl;
return 0;
}
/**********************
0x7ffe8319e670
0x7ffe8319e670
0x7ffe8319e674
0x7ffe8319e678
***********************/

笔试题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
int main()
{
//数组的定义并赋值,不知道这个,建议回家
int a[5]={1,2,3,4,5};
//这时这个,ptr1保存的是最后一个元素的下一个地址
int *ptr1=(int *)(&a+1);
//(int)a,是不是把数组的地址强转成整型,这样+1,只是在个这个地址值加了一
//个1。还记得a+1吗,由于a是数组的名首地址,a+1的值是多少?你懂的。
int *ptr2=(int *)((int )a+1);
//ptr1[-1],下表是-1?哇塞,不可能吧?笨笨都是这样想,但我们是开发人员,
//我们知道ptr1[-1],其实可以看成*(ptr1 -1)。还记得ptr1保存的值吗?知道ptr1[-1]的值吧.
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
/**********************
5,,2000000
***********************/