领略指针之妙

本文探讨了C语言中指针的重要性,通过一个代码示例详细解析了指针操作,包括**++cpp、*--*++cpp+3、*cpp[-2]+3和cpp[-1][-1]+1等表达式的含义,旨在帮助读者深入理解指针的工作原理。
摘要由CSDN通过智能技术生成

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk

      ⸝⋆   ━━━┓
     - 个性标签 - :来于“云”的“羽球人”。 Talk is cheap. Show me the code
┗━━━━━━━  ➴ ⷯ

本人座右铭 :   欲达高峰,必忍其痛;欲戴王冠,必承其重。

👑💎💎👑💎💎👑 
💎💎💎自💎💎💎
💎💎💎信💎💎💎
👑💎💎 💎💎👑    希望在看完我的此篇博客后可以对你有帮助哟

👑👑💎💎💎👑👑   此外,希望各位大佬们在看完后,可以互赞互关一下,看到必回
👑👑👑💎👑👑👑


 想必各位老铁们也知道,C语言的灵魂就在于指针,他很神奇,就像一把神奇的钥匙,可以打开指定的房间。有了这个精确的地址,我们也就不用再怕“迷路”了,

OK,话不多说,接下来给各位老铁们看个神奇的代码,没错,就是此时屏幕前的你,顺便看看自己是否对指针轻松拿捏,不过话说在前面,下面这个代码要是对指针没有一定的功力再结合“码图”(也就是画图),可不是件容易的事

 题目:
#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;
}

 各位老铁们咱也就动起来吧,看看自己咋样

 分析:
1)初始状态对应的草图

 2)**++cpp的分析

1:cpp初始状态是指向数组cp的首元素的地址

2:++cpp注意这是前置加加(也就意味着cpp的指向要改变,同时也会对后面cpp的一系列操作有影响)cpp此时指向cp数组的第二个元素的地址

3:**++cpp 第一次解引用是指向c+2,再一次解引用是指向POINT这个字符串所指向的首元素地址

4:结果:POINT

3)*--* ++cpp +3

草图如下:

1:看到这个表达式可能有些老铁会发懵,不知从何下手(优先级)

注意上一行代码:printf("%s\n",**++cpp ); 已经改变了cpp的指向(此时指向数组cp 里面的第二个元素即 cp +1 这个地址)

 2:printf("%s\n", *--* ++cpp +3);

   此时的++cpp:指向数组cp的第二个元素(cp+2)

3: 此时对++cpp进行解引用:指向数组C第二个元素的地址(c+1),再--指向的是数组C第一个元素的地址(c+ 0)对他进行解引用指向ENTER这个字符串首字符地址

4:此时最后指向 +3 的操作:对字符串跳过三个字符指向  E

5:  打印结果: ER

4)*cpp[-2]+3

1:*cpp[-2]+3 ==   *(*(cpp - 2)) +3

2:cpp指向数组cp的第二个元素(cp+2)

3:cpp -2指向 cp+0 

4:*(cpp-2)访问的是 c+3

5:*(*(cpp-2)) 访问的是字符串 FIREST指向的第一个字符从地址

6: *(*(cpp - 2)) +3  此时指向 E的地址

7:打印:ST

5) cpp[-1][-1]+1 

 1:cpp[-1][-1]+1  == *(*(cpp-1)-1) +1

    注意只有对指针赋值才能改变指针指向,*(*(cpp-1)-1) +1这种写法并没有改变指针指向

    也就是说,此时cpp 依然是指向数组cp 里面的第三个元素位置(cp+2)

2:cpp-1  是指向 数组cp 第二个元素位置,cp+1 

3:此时*(cpp-1):解引用是指向 c+2 的地址 ,

      此时 *(cpp-1)-1 在对这个地址-1,是指向c+1这个地址

4:*((*(cpp-1)-1))这个地址进行解引用(指向NEW的首字符地址)

注意:可不是对c+ 2 这个地址解引用(错在:对cpp-1后忘了解引用,就比如说我,嘻嘻嘻)

5: (*(*(cpp-1)-1) )+ 1 指向NEW这个字符串的第二个字符 E这个字符对应的地址

6:打印  :EW

 分析半天是对是错呢,咱让程序跑起来也看一眼:

结果:

总结:

1)对指针加减一个整数,由指针的类型决定了指针向前或者是向后跳过几个字节

2)指针相减(大-小)= 元素个数

3)一维数组名:数组首元素的地址

4)二维数组名:依然是数组首元素的地址(只不过是表示这个二维数组的第一行元素的地址)

5)对二维数组的理解:可以看作是由一维数组组成的数组

6)操作符的优先级

7)代码与画图要结合(很重要)

结语:

或许这就是编程的魅力,我永远沉迷于此,陶醉其中。希望各位老铁看到我的这篇博客可以对指针有更深的理解,也希望"小白"也能有所收获,不过咱还是有啥说啥,这确实是需要一点点的功力的,没有点底子可能或许稍微吃力,欧克,又到了各位主角的舞台了(咱一波关注,一波赞走起,也是更好激励我的) 

  • 40
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值