19.0、C语言——指针笔试面试题

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) 这个相关概念即可;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值