先决条件:指针
假设int的大小= 4个字节,指针变量的大小= 8个字节,以下程序的输出将是什么。
关于如何解决它的一些提示:
- int的大小= 4个字节,指针变量的大小= 8个字节(在我的机器上),将指针加1会使指针指向其下一个立即类型
- a的类型为int(*)[5] [6]
- a1是int *类型的,a2是int **类型的,a3是int **类型的
- &a1的类型为int **,&a2的类型为int ***,&a3的类型为int ****。由于所有都指向一个指针,因此加1意味着增加8个字节(一个指针的大小)
- a [0] [0] [0]的类型为int,&a [0] [0] [0]的类型为int *,a [0] [0]的类型为int *,&a [0] [0] ]的类型为int(*)[6],a [0]的类型为int(*)[6],&a [0]的类型为int(*)[5] [6],a的类型为int (*)[5] [6],&a的类型为int(*)[4] [5] [6]
// CPP program to illustrate concept
// of pointers
#include
int main()
{
int a[4][5][6];
int x = 0;
int* a1 = &x;
int** a2 = &a1;
int*** a3 = &a2;
printf("%d %d %d %d\n", sizeof(a), sizeof(a1), sizeof(a2), sizeof(a3));
printf("%d ", (char*)(&a1 + 1) - (char*)&a1);
printf("%d ", (char*)(&a2 + 1) - (char*)&a2);
printf("%d ", (char*)(&a3 + 1) - (char*)&a3);
printf("%d \n", (char*)(&a + 1) - (char*)&a);
printf("%d ", (char*)(a1 + 1) - (char*)a1);
printf("%d ", (char*)(a2 + 1) - (char*)a2);
printf("%d ", (char*)(a3 + 1) - (char*)a3);
printf("%d \n", (char*)(a + 1) - (char*)a);
printf("%d ", (char*)(&a[0][0][0] + 1) - (char*)&a[0][0][0]);
printf("%d ", (char*)(&a[0][0] + 1) - (char*)&a[0][0]);
printf("%d ", (char*)(&a[0] + 1) - (char*)&a[0]);
printf("%d \n", (char*)(&a + 1) - (char*)&a);
printf("%d ", (a[0][0][0] + 1) - a[0][0][0]);
printf("%d ", (char*)(a[0][0] + 1) - (char*)a[0][0]);
printf("%d ", (char*)(a[0] + 1) - (char*)a[0]);
printf("%d \n", (char*)(a + 1) - (char*)a);
}
输出:
480 8 8 8
8 8 8 480
4 8 8 120
4 24 120 480
1 4 24 120
相关文章:
- 指针测验
- 悬空,无效,空指针和野生指针
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程” 。