指针和数组笔试题解析_指针

今日份练习“指针和数组”试题练习1

前言:

熟练掌握指针在数组中具体是如何运动的,解题将以逻辑图的方式对此更清晰的理解。

T1:
#include<stdio.h>
int main()
{
	int arr[4] = { 1,2,3,4 };
	int* ptr1 = (int*)(&arr + 1);
	int* ptr2 = (int*)((int)arr + 1);
	printf("%x\n", ptr1[-1]);
	printf("%x\n" ,*ptr2);
	return 0;
}

尝试自己读一读该代码,结果会输出什么?(自己先想一会儿哦🤔)

👇

👇

👇

指针和数组笔试题解析_“C的笔试题详解”_02

"4,2000000"是否一致呢?我们来画图就能很容易理解啦。

解析:

首先是arr[4]👉                指针和数组笔试题解析_“C的笔试题详解”_03

arr[4]在内存中的存储方式为:0100 0200 0300 0400   (十六进制小端存储方式)

整型指针:int* prtr1=(int*)(&arr+1);

&arr1(取地址数组名)该地址代表整个数组,+1后跳过整个数组指针和数组笔试题解析_“C的笔试题详解”_04跳过整个数组后指向了一块未知的内存空间

且将其强制转换为(int*)赋给int*ptr1,

此时prt1 指针指向这块空间指针和数组笔试题解析_指针_05


整型指针:int* prt2=(int*)((int)arr+1);

此时的数组名arr代表首元素的地址(&arr代表整个数组),按照优先级和结合性先进行强制类型转换(int)arr将arr的地址(举个例子:0x0117fa24)转为整型:0117fa24(十六进制),加1为:0117fa25,再将该整数转换为地址

相当于只跳了一个字节。

则int *prt2👉指针和数组笔试题解析_“C的笔试题详解”_06

这就是两指针变量中存的值,接下来看打印

1.printf("%x\n",prt1[-1]);

prt1[-1]相当于*(prt-1)

prt1👉指针和数组笔试题解析_指针_05prt1-1👉指针和数组笔试题解析_“C的笔试题详解”_08

往前跳一个整型再解引用得到4

2.printf("%x\n",*prt2);

prt2👉指针和数组笔试题解析_“C的笔试题详解”_06此时的prt2指向第三个字节的空间的地址

prt2为整型指针,解引用将访问一个整型空间(4个字节)则将访问0002指针和数组笔试题解析_指针_10十六进制为:0x02000000

以%x打印则省略2前面的0x0,结果为2000000

😃你学废了嘛?

敬请期待下一题~

指针和数组笔试题解析_“C的笔试题详解”_11