目录
- 一、前言
- 二、一维数组
- 2.1代码
- 2.2分析
- 2.3验证运行结果
- 三、字符数组
- 3.1代码1
- 3.1.1分析
- 3.1.2验证运行结果
- 3.2代码2
- 3.2.1分析
- 3.2.2验证运行结果
- 3.3代码3
- 3.3.1分析
- 3.3.2验证运行结果
- 3.4代码4
- 3.4.1分析
- 3.4.2验证运行结果
- 3.5代码5
- 3.5.1分析
- 3.5.2验证运行结果
- 3.6代码6
- 3.6.1分析
- 3.6.2验证运行结果
- 四、二维数组分析以及解释
- 五、 指针运算笔试题解析
- 5.1代码1
- 5.1.1分析
- 5.1.2验证运行结果
- 5.2代码2
- 5.3代码3
- 5.3.1分析
- 5.3.2验证运行结果
- 5.4代码4
- 5.4.1分析
- 5.4.2验证运行结果
- 5.5代码5
- 5.5.1分析
- 5.5.2验证运行结果
- 5.6代码6
- 5.6.1分析
- 5.6.2验证运行结果
- 代码7
- 5.7.1分析
- 5.7.2验证运行结果
一、前言
这些题目是关于数组和指针笔试的题目,建议在看解析之前认真想一想。
二、一维数组
2.1代码
#include<stdio.h>
int main()
{
int a[] = { 1,2,3,4 };
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(a + 0));
printf("%d\n", sizeof(*a));
printf("%d\n", sizeof(a + 1));
printf("%d\n", sizeof(a[1]));
printf("%d\n", sizeof(&a));
printf("%d\n", sizeof(*&a));
printf("%d\n", sizeof(&a + 1));
printf("%d\n", sizeof(&a[0]));
printf("%d\n", sizeof(&a[0] + 1));
return 0;
}
2.2分析
讲这个之前先讲一下,数组名的意义:
- sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
- &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
- 除此之外所有的数组名都表示首元素的地址。
2.3验证运行结果
三、字符数组
3.1代码1
#include<stdio.h>
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", sizeof(arr));
printf("%d\n", sizeof(arr + 0));
printf("%d\n", sizeof(*arr));
printf("%d\n", sizeof(arr[1]));
printf("%d\n", sizeof(&arr));
printf("%d\n", sizeof(&arr + 1));
printf("%d\n", sizeof(&arr[0] + 1));
return 0;
}
3.1.1分析
3.1.2验证运行结果
3.2代码2
#include<stdio.h>
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr + 0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr + 1));
printf("%d\n", strlen(&arr[0] + 1));
return 0;
}
3.2.1分析
3.2.2验证运行结果
3.3代码3
#include<stdio.h>
int main()
{
char arr[] = "abcdef";
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
return 0;
}
3.3.1分析
3.3.2验证运行结果
3.4代码4
#include<stdio.h>
int main()
{
char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//计算的是数组的总大小,别忘了字符串还有给\0--7
printf("%d\n", sizeof(arr + 0));//arr数组表示首元素地址,是地址就是4/8字节
printf("%d\n", sizeof(*arr));//1字节
printf("%d\n", sizeof(arr[1]));//1字节
printf("%d\n", sizeof(&arr));//是地址就是4/8个字节
printf("%d\n", sizeof(&arr + 1));//是地址就是4/8个字节
printf("%d\n", sizeof(&arr[0] + 1));//是地址就是4/8个字节
return 0;
}
3.4.1分析
3.4.2验证运行结果
3.5代码5
#include<stdio.h>
int main()
{
char* p = "abcdef";
printf("%d\n", sizeof(p));
printf("%d\n", sizeof(p + 1));
printf("%d\n", sizeof(*p));
printf("%d\n", sizeof(p[0]));
printf("%d\n", sizeof(&p));
printf("%d\n", sizeof(&p + 1));
printf("%d\n", sizeof(&p[0] + 1));
return 0;
}
3.5.1分析
3.5.2验证运行结果
3.6代码6
#include<stdio.h>
int main()
{
char* p = "abcdef";
printf("%d\n", strlen(p));
printf("%d\n", strlen(p + 1));
printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));
printf("%d\n", strlen(&p));
printf("%d\n", strlen(&p + 1));
printf("%d\n", strlen(&p[0] + 1));
return 0;
}
3.6.1分析
3.6.2验证运行结果
四、二维数组分析以及解释
#include<stdio.h>
int main()
{
int a[3][4] = { 0 };
printf("%d\n", sizeof(a));//数组名,计算整个数组的大小--48
printf("%d\n", sizeof(a[0][0]));//是第一行第一个元素大小是4字节
printf("%d\n", sizeof(a[0]));//是第一行的数组名,大小是16个字节
printf("%d\n", sizeof(a[0] + 1));//--a[0][1]的地址,大小是4字节
printf("%d\n", sizeof(*(a[0] + 1)));//第一行第二个元素,大小就是4字节
printf("%d\n", sizeof(a + 1));//a是首元素的地址,也就是第一行的地址,a+1就是第二行的地址,4/8
printf("%d\n", sizeof(*(a + 1)));//计算的是第二行的大小-16
printf("%d\n", sizeof(&a[0] + 1));//a[0]是第一行的数组名,&a[0]取出的就是数组的地址,4/8
printf("%d\n", sizeof(*(&a[0] + 1)));//第二行,16
printf("%d\n", sizeof(*a));//第一行--16
printf("%d\n", sizeof(a[3]));//是第四行的数组名,单独放在sizeof内部,计算的是第四行的大小,16字节
return 0;
}
五、 指针运算笔试题解析
5.1代码1
#include <stdio.h>
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf( "%d,%d", *(a + 1), *(ptr - 1));//2 5
return 0;
}
5.1.1分析
5.1.2验证运行结果
5.2代码2
//在X86环境下
//假设结构体的大小是20个字节
//程序输出的结构是啥?
truct Test
{
int Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}*p = (struct Test*)0x100000;
int main()
{
printf("%p\n", p + 0x1);//00100014
//指针加减整数
printf("%p\n", (unsigned long)p + 0x1);//00100001
printf("%p\n", (unsigned int*)p + 0x1);//00100004
return 0;
}
5.3代码3
#include <stdio.h>
int main()
{
int a[3][2] = { (0, 1), (2, 3), (4, 5) };
int *p;
p = a[0];
printf( "%d", p[0]);
return 0;
}
5.3.1分析
因为数组内是逗号表达书,所以数组化简得到a[3][2]={1,2,3}
又因为是二维数组,所以p[0]是第一行首元素为1
5.3.2验证运行结果
5.4代码4
//假设环境是x86环境,程序输出的结果是啥?
#include <stdio.h>
int main()
{
int a[5][5];
int(*p)[4];
p = a;
printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);//FFFFFFFFFFFFFFFC,-4
return 0;
}
5.4.1分析
5.4.2验证运行结果
5.5代码5
#include <stdio.h>
int main()
{
int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int *ptr1 = (int *)(&aa + 1);
int *ptr2 = (int *)(*(aa + 1));
printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));//10,5
return 0;
}
5.5.1分析
5.5.2验证运行结果
5.6代码6
#include <stdio.h>
int main()
{
char *a[] = {"work","at","alibaba"};
char**pa = a;
pa++;
printf("%s\n", *pa);//at
return 0;
}
5.6.1分析
5.6.2验证运行结果
代码7
#include <stdio.h>
int main()
{
char *c[] = {"ENTER","NEW","POINT","FIRST"};
char**cp[] = {c+3,c+2,c+1,c};
char***cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *--*++cpp+3);
printf("%s\n", *cpp[-2]+3);
printf("%s\n", cpp[-1][-1]+1);
return 0;
}
5.7.1分析
5.7.2验证运行结果
欧耶!!!!我学会啦!!!!