一、数组和指针笔试题解析
指针在64位平台占8byte
在32位平台占4byte
第一题
int a[] = { 1,2,3,4 };
printf("1.%d\n", sizeof(a));
printf("2.%d\n", sizeof(a + 0));
printf("3.%d\n", sizeof(*a));
printf("4.%d\n", sizeof(a + 1));
printf("5.%d\n", sizeof(a[1]));
printf("6.%d\n", sizeof(&a));
printf("7.%d\n", sizeof(*&a));
printf("8.%d\n", sizeof(&a + 1));
printf("9.%d\n", sizeof(&a[0]));
printf("10.%d\n", sizeof(&a[0] + 1));
答案
int a[] = { 1,2,3,4 };
printf("1.%d\n", sizeof(a)); //16
printf("2.%d\n", sizeof(a + 0)); //地址:4/8
printf("3.%d\n", sizeof(*a)); //4
printf("4.%d\n", sizeof(a + 1)); //地址:4/8
printf("5.%d\n", sizeof(a[1])); //4
printf("6.%d\n", sizeof(&a)); //地址:4/8
printf("7.%d\n", sizeof(*&a)); //16
printf("8.%d\n", sizeof(&a + 1)); //地址:4/8
printf("9.%d\n", sizeof(&a[0])); //地址:4/8
printf("10.%d\n", sizeof(&a[0] + 1));//地址:4/8
第二题
char arr[] = { 'a','b','c','d','e','f' };
printf("1.%d\n", sizeof(arr));
printf("2.%d\n", sizeof(arr + 0));
printf("3.%d\n", sizeof(*arr));
printf("4.%d\n", sizeof(arr[1]));
printf("5.%d\n", sizeof(&arr));
printf("6.%d\n", sizeof(&arr + 1));
printf("7.%d\n", sizeof(&arr[0] + 1));
答案
char arr[] = { 'a','b','c','d','e','f' };
printf("1.%d\n", sizeof(arr)); //6
printf("2.%d\n", sizeof(arr + 0)); //地址:4/8
printf("3.%d\n", sizeof(*arr)); //1
printf("4.%d\n", sizeof(arr[1])); //1
printf("5.%d\n", sizeof(&arr)); //地址:4/8
printf("6.%d\n", sizeof(&arr + 1)); //地址:4/8
printf("7.%d\n", sizeof(&arr[0] + 1)); //地址:4/8
第三题
char arr[] = { 'a','b','c','d','e','f' };
printf("1.%d\n", strlen(arr));
printf("2.%d\n", strlen(arr + 0));
//printf("3.%d\n", strlen(*arr));
//printf("4.%d\n", strlen(arr[1]));
printf("5.%d\n", strlen(&arr));
printf("6.%d\n", strlen(&arr + 1));
printf("7.%d\n", strlen(&arr[0] + 1));
//且1,2,5号随机值相等,因为都从首元素地址开始
答案
char arr[] = { 'a','b','c','d','e','f' };
printf("1.%d\n", strlen(arr)); //无 '\0',随机值
printf("2.%d\n", strlen(arr + 0)); //无 '\0',随机值
//printf("3.%d\n", strlen(*arr)); //*arr = 'a' ,error
//printf("4.%d\n", strlen(arr[1])); //arr[1] = 'b',error
printf("5.%d\n", strlen(&arr)); //无 '\0',随机值
printf("6.%d\n", strlen(&arr + 1)); //无 '\0',随机值
printf("7.%d\n", strlen(&arr[0] + 1)); //无 '\0',随机值
//且1,2,5号随机值相等,因为都从首元素地址开始
第四题
char arr[] = "abcdef"; //X
printf("1.%d\n", sizeof(arr));
printf("2.%d\n", sizeof(arr + 0));
printf("3.%d\n", sizeof(*arr));
printf("4.%d\n", sizeof(arr[1]));
printf("5.%d\n", sizeof(&arr));
printf("6.%d\n", sizeof(&arr + 1));
printf("7.%d\n", sizeof(&arr[0] + 1));
答案
char arr[] = "abcdef";
printf("1.%d\n", sizeof(arr)); //7 :a,b,c,d,e,f,'\0'
printf("2.%d\n", sizeof(arr + 0)); //地址:4/8
printf("3.%d\n", sizeof(*arr)); // 1: 'a'
printf("4.%d\n", sizeof(arr[1])); //1: 'b'
printf("5.%d\n", sizeof(&arr)); //地址:4/8
printf("6.%d\n", sizeof(&arr + 1)); //地址:4/8
printf("7.%d\n", sizeof(&arr[0] + 1)); //地址:4/8
第五题
char arr[] = "abcdef";
printf("1.%d\n", strlen(arr));
printf("2.%d\n", strlen(arr + 0));
//printf("3.%d\n", strlen(*arr));
//printf("4.%d\n", strlen(arr[1]));
printf("5.%d\n", strlen(&arr));
printf("6.%d\n", strlen(&arr + 1));
printf("7.%d\n", strlen(&arr[0] + 1));
答案
char arr[] = "abcdef";
printf("1.%d\n", strlen(arr)); //6
printf("2.%d\n", strlen(arr + 0)); //6
//printf("3.%d\n", strlen(*arr)); //error
//printf("4.%d\n", strlen(arr[1])); //error
printf("5.%d\n", strlen(&arr)); //6
printf("6.%d\n", strlen(&arr + 1)); //5 取出的是整个地址
printf("7.%d\n", strlen(&arr[0] + 1)); //5
第六题
char* p = "abcdef";
printf("1.%d\n", sizeof(p));
printf("2.%d\n", sizeof(p + 1));
printf("3.%d\n", sizeof(*p));
printf("4.%d\n", sizeof(p[0]));
printf("5.%d\n", sizeof(&p));
printf("6.%d\n", sizeof(&p + 1));
printf("7.%d\n", sizeof(&p[0] + 1));
答案
char* p = "abcdef";
printf("1.%d\n", sizeof(p)); //地址:4/8
printf("2.%d\n", sizeof(p + 1)); //地址:4/8
printf("3.%d\n", sizeof(*p)); //1
printf("4.%d\n", sizeof(p[0])); //1
printf("5.%d\n", sizeof(&p)); //地址:4/8
printf("6.%d\n", sizeof(&p + 1)); //地址:4/8
printf("7.%d\n", sizeof(&p[0] + 1));//地址:4/8
第七题
char* p = "abcdef";
printf("1.%d\n", strlen(p));
printf("2.%d\n", strlen(p + 1));
//printf("3.%d\n", strlen(*p));
//printf("4.%d\n", strlen(p[0]));
printf("5.%d\n", strlen(&p));
printf("6.%d\n", strlen(&p + 1));
printf("7.%d\n", strlen(&p[0] + 1));
答案
char* p = "abcdef";
printf("1.%d\n", strlen(p)); //6
printf("2.%d\n", strlen(p + 1)); //5
//printf("3.%d\n", strlen(*p)); //error
//printf("4.%d\n", strlen(p[0])); //error
printf("5.%d\n", strlen(&p)); //随机 X
printf("6.%d\n", strlen(&p + 1)); //随机 X
//&p是指针变量p的地址,和字符串"abcdef"关系就不大了
//从p这个指针变量的起始位置开始向后数的,p变量存放的地址是什么,不知道,所以答案是随机值
printf("7.%d\n", strlen(&p[0] + 1)); //5
第八题
int a[3][4] = { 0 };
printf(" 1.%d\n", sizeof(a));
printf(" 2.%d\n", sizeof(a[0][0]));
printf(" 3.%d\n", sizeof(a[0]));
printf(" 4.%d\n", sizeof(a[0] + 1));
printf(" 5.%d\n", sizeof(*(a[0] + 1)));
printf(" 6.%d\n", sizeof(a + 1));
printf(" 7.%d\n", sizeof(*(a + 1)));
printf(" 8.%d\n", sizeof(&a[0] + 1));
printf(" 9.%d\n", sizeof(*(&a[0] + 1)));
printf("10.%d\n", sizeof(*a));
printf("11.%d\n", sizeof(a[3]));
答案
int a[3][4] = { 0 };
printf(" 1.%d\n", sizeof(a)); //48
printf(" 2.%d\n", sizeof(a[0][0])); //4
printf(" 3.%d\n", sizeof(a[0])); //16
printf(" 4.%d\n", sizeof(a[0] + 1)); // 地址 4/8
printf(" 5.%d\n", sizeof(*(a[0] + 1))); //4
printf(" 6.%d\n", sizeof(a + 1)); //地址 4/8
printf(" 7.%d\n", sizeof(*(a + 1))); //16
printf(" 8.%d\n", sizeof(&a[0] + 1)); //地址 4/8
printf(" 9.%d\n", sizeof(*(&a[0] + 1)));//16
printf("10.%d\n", sizeof(*a)); //16
printf("11.%d\n", sizeof(a[3])); // X
//a[3]无需真实存在,仅仅通过类型的推断就能算出长度
//a[3]是第四行的数组名,单独放在sizeof内部,计算的是第四行的大小,16个字节
二、指针运算笔试题解析
第一题
int a[5] = { 1, 2, 3, 4, 5 };
int* ptr = (int*)(&a + 1);
printf("%d,%d", *(a + 1), *(ptr - 1));
答案
2,5
第二题
#include<stdio.h>
//在X86(32位平台)环境下
//假设结构体的⼤⼩是20个字节
//程序输出的结构是啥?
struct Test
{
int Num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}*p = (struct Test*)0x100000;
int main()
{
printf("%p\n", p + 0x1);
printf("%p\n", (unsigned long)p + 0x1);
printf("%p\n", (unsigned int*)p + 0x1);
return 0;
}
答案
00100014
00100001
00100004
第三题
int a[3][2] = { (0, 1), (2, 3), (4, 5) };
int* p;
p = a[0];
printf("%d", p[0]);
答案
1
第四题
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]);
答案
FFFFFFFC,-4
第五题
char* a[] = { "work","at","alibaba" };
char** pa = a;
pa++;
printf("%s\n", *pa);
答案
at
第六题
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);
答案
POINT
ER
ST
EW
如果这篇有人看,我会后续更新详解。(^ _ ^)
如果这篇有什么不对的地方,还请各位同志指正。谢谢!