19.0、C语言——指针笔试面试题
1、计算出输出的结果:
int main() {
int a[5] = {1,2,3,4,5};
int* ptr = (int*)(&a + 1);
printf("%d,%d\n",*(a+1),*(ptr - 1));
return 0;
}
输出的结果为 2 ,5
2、计算出输出的结果【本题主要考察 指针 的+-整数运算】:
struct Test {
int num;
char* pcName;
short sDate;
char cha[2];
short sBa[4];
}* p;
//假设p的值为 0x100000 如下表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20字节
int main() {
p = (struct Test*)0x100000;
printf("%p\n",p + 0x1);
printf("%p\n",(unsigned long)p + 0x1);
printf("%p\n",(unsigned int*)p + 0x1);
return 0;
}
结果从上到下输出结果分别是:
0x00100014 【p的大小已知是20字节,所以 p + 1就会跳过 20 字节,20转换为十六进制就是0x14】
0x00100001 【强制转换成无符号long类型之后再 + 1就相当于是0x100000+0x000001】
0x00100004 【强制类型转换成无符号int*类型后+1等于跳过4个字节,相当于0x100000+0x000004】
3、计算出输出的结果
int main() {
int a[4] = { 1,2,3,4 };
int* ptr1 = (int*)(&a + 1);
int* ptr2 = (int*)((int)a + 1);
printf("%x,%x",ptr1[-1],*ptr2);
return 0;
}
4、计算出输出的结果
int main() {
int a[3][2] = {(0,1),(2,3),(4,5)};
int* p;
p = a[0];
printf("%d\n",p[0]);
return 0;
}
输出的结果为 1 :
首先我们要明白二维数组初始化中他用的是 ( ) ,那么这就是一个逗号表达式,实际上初始化的数据为 1 ,3 ,5 ,0 , 0 ,0;
那么指针 p 存放的就是 1 的地址,p[ 0 ] = p+0 所以p[ 0 ] = 1
5、计算出输出的结果
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]);
return 0;
}
一定要重点理解:
&arr = 整个数组的地址;
*(&arr) = *(整个数组的地址) = arr = 数组名 = 首元素地址;
arr[ 2 ] 相当于是 *(arr + 2) 得到数组中第三个元素的值;
最后输出的结果是:f f f f f f f c,-4
这里低地址减高地址为负数 - 4
6、计算出输出的结果
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\n",*(ptr1 - 1),*(ptr2 - 1));
return 0;
}
这里需要注意的是:ptr1 的类型不是数组指针类型而是 int*类型
输出的结果是:10,5
7、计算出输出的结果
int main() {
char* a[] = { "work","at","alibaba" };
char** pa = a;
pa++;
printf("%s\n",*pa);
return 0;
}
这里要掌握 指针 + 1 到底跳过多少字节,之前我们也说过这个取决于该指针指向的变量是什么类型,例如 int* p = &a; 那么p + 1 就跳过4个字节的
一开始指针 pa 中存放的是数组 a[] 中首元素的地址,然后 pa++ 【这里要知道 pa 的类型是char*】也就是存放在 pa 中的地址 + 1 -> 往下跳过一个char*类型的内存空间,此时 pa 中存放的地址就变成了 "at" 第二个字符串元素的首地址
8、计算出输出的结果
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;
}
输出的结果为:
POINT
ER
ST
EW
这道题相对来说比较复杂,但是解题方法和前面的差不多就不过多解释了;
只要弄清楚 cpp[ -2 ] 相当于是 *(cpp - 2) 这个相关概念即可;