指针笔试题解析(4)

举报
念君思宁 发表于 2023/02/14 21:24:38 2023/02/14
【摘要】 指针笔试题解析(4)

指针对于不少人来说:是多么一个难的代名词呀!!当然这个里面也包括笔者!所以……笔者对于指针满满的后怕!但是也有着更多的期待!毕竟阴影是用来打破的!后怕打破了,也就是龙腾虎跃的时候了!!下面进入正题:

笔者将用代码+解析的方式来带领大家走进:指针!!
第一题!

#include <stdio.h>
int main()
{
	int arr[2][5] = { 1,2,3,4,5,6,7,8,9,10 };
	int* ptr1 = (int*)(&arr + 1);
	int* ptr2 = (int*)(*(arr + 1));
 
	printf("%d %d \n", *(ptr1 - 1), *(ptr2 - 1));  //10  5
	return 0;
}

1.对于数组:    int arr[2][5] = { 1,2,3,4,5,6,7,8,9,10 };

 我们也可以写为:

更为方便使用!!

2. &arr  : 取出的是二维数组的地址!&arr+1,跳过整个数组,通过:(int*)(&arr + 1)  强制类型转化为:整型指针!

&arr+1是一个数组指针

ptr1的类型为:int* ; ptr1-1向前挪动一个整型,指向10的地址!再通过*(ptr-1)解引用操作,得到10;

3.arr是二维数组的数组名,数组名表示二维数组的首元素的地址!二维数组的首元素为第一行,即表示第一行的地址!arr+1  :跳过第一行,对*(arr+1)进行解引用得到第二行!*(arr+1) 相当于arr[1],即,第二行的数组名!而arr[1]并没有单独放在sizeof内部,也没有进行&(取地址操作),即指:arr[1][0]的地址!也为元素6的地址!而对于:6的地址,不需要转化为:int *  故 题目中的(int*)(*(arr + 1)):int *是迷惑人的!!ptr2拿到6的地址!而对ptr2-1,向前挪动一位,*(ptr2-1)解引用,得到元素5!!

 

代码的运行结果为:

 第二题

#include <stdio.h>
int main()
{
	char* arr[] = { "wolk","at","ailibaba" };
	char** pa = arr;
	pa++;
	printf("%s\n", *pa);  //at
	return 0;
}

对于:     char* arr[] = { "wolk","at","ailibaba" };  数组的每个元素都为: char *   ,即,数组arr里面存放的都是char *的指针(地址)!而字符串作表达式的时候,它的值,实际上为首字符的地址!!

 而对于:char** pa = arr;  pa是一个二级指针,而将arr赋值给pa, a 是数组名,表示首元素的地址!每个元素都是char* ;

但是对于:char **pa,该如何理解?

*pa指的是:pa为指针!char* 告诉我们,pa指向的对象为:char *类型!

pa++: 跳过一个char* 类型的元素大小,即指向at!!

代码的运行结果为:

 对于指针的笔试题,经过4个博客,笔者终于写完了!!在最后,为了考验一下!请自主完成……

#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;
 
}

非常有难度!代码的运行结果为:


【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。