指针笔试题解析(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;

}

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

猜你喜欢

转载自blog.csdn.net/weixin_64308540/article/details/127026552