第三板块-普通仙女对指针的学习记录(从入门到学废)

目录

三、指针与数组(简单篇)

指针与++:

指针与+:

指针求差:

指针表示法和数组表示法:


三、指针与数组(简单篇)

首先,我们举一个变相使用指针的栗子--数组名,也就是数组首元素的地址

rabbit=&rabbit[0]; 不过这两个都是地址,是不会改变的常量,但是如果把他们赋值给指针变量,我们就可以修改指针变量的值实现访问数组各元素。

指针与++:

1.(*rabbit)++;

        *rabbit不就是拿着小钥匙开门吗?所以括号里面是一个数啦~这句话相当于数的++;

2.*(rabbit++);

        rabbit是数组首元素的地址吖,一次rabbit++就相当于地址+1,不过这里的加1不是真正意义上的加一(不好意思有点绕),因为地址是按照字节编址的,所以实际上是加一个储存单元,也就是“一个数据类型的长度”。这也侧面反映了为什么我们在声明一个指针变量时必须声明所指对象

        所以这一次的rabbit++指向下一个元素,也就是rabbit[1];

练习2.1:

来感受一下指针访问数组的快乐叭~

#include<stdio.h>
int main()
{
	int rabbit[5]={0,1,2,3,999};
	int *p;
	p=&rabbit[0];//p指向rabbit数组的首元素
	int i=0;
	for(i=0;i<5;i++)
	{
		printf("%d\n", (*p)++ );//这样输出的不是数组元素们 
	 } 
	for(i=0;i<5;i++)
	{
		printf("%d\n", *p++ );//这样才是访问数组元素呢 
	 } 
	
	return 0;
}

指针与+:

首先声明*的运算级是高于+的,所以*rabbit+2就相当于给rabbit加了小括号,即(*rabbit)+2;

rabbit+2==&rabbit[2];        //地址相同

*(rabbit+2)==rabbit[2];        //相同的值,可以理解为   “到rabbit的房间门口,移动2个类型单元房间并检索房间里的人”

我们敲一段代码感受一下

练习2.2:

#include<stdio.h>
int main()
{
	int rabbit[5]={0,1,2,3,4};
	int *p;
	p=rabbit;//p指向rabbit数组的首元素
	printf("%d\n",rabbit[0]);
	printf("%d\n",*rabbit);
	printf("%d\n",*p);
	
    printf("%d\n",*p+999);//看叭,是给数值加999对吧~ 
    
	printf("%d\n",rabbit[3]);
	printf("%d\n",*(p+3));//这个就是地址在移动了
	return 0;
}

既然我们可以通过指针访问数组里的各个元素,闲着也是闲着,不如写一个函数,求数组各元素的和,用指针写好啦~

练习2.3:

#include<stdio.h>
int Sum(int *ar,int num)//形参num是数组中元素的个数
{
	int sum=0;
	for(int i=0;i<num;i++)
	{
		sum+=(*ar++);
	}
	return sum;
}

int main()
{
	int rabbit[5]={0,1,2,3,999};
	int *p;
	p=rabbit;//p指向rabbit数组的首元素
	printf("the result is :%d",Sum(p,5));//Sum函数就获取了数组首元素的地址
	
	
	return 0;
}

值得一提的是,int *arint ar[]都可以表示ar是一个指向int的指针;后者更能表示出指向的是一个int类型的数组。

指针求差:

int *p1=&rabbit[0];     int *p2=&rabbit[1];

p2-p1=???

我们敲一段代码试试:

#include<stdio.h>
int main()
{
	int rabbit[5]={0,1,2,3,999};

	int *p1=&rabbit[0];
	int *p2=&rabbit[1];
	printf("%d\n",p1);
	printf("%d\n",p2);
   printf("%d",p2-p1);
	
	
	return 0;
}

我的电脑得到的结果是:p1=6487536        p2=6487540        p2-p1=1

一般来说,我们的指针求差指向的是同一个数组的不同元素,得出结果是两个元素间的距离,其单位和数组类型单位一样。上例里面1指的就是两个元素相隔1个int。

指针表示法和数组表示法:

因为之前都用int类型的数组,这次换个口味~~

  1. char *p="some";        char rabbit[ ]="rabbit";        rabbit[i] *(rabbit+i)  与  *(p+i)是等价的
  2. p是指针变量;rabbit是地址常量。
  3. 初始化:对于p就是把地址拷贝一份;对于rabbit就是把静态存储区中的字符串拷贝到数组里。
  4. 可以递增指针来访问下一个数组元素:++p;但是没有++rabbit(哒咩)
  5. 不过两者都可以加法,可以rabbit+1来标识下一个元素

当然,p也可以用数组表示法,即p[i];


好啦好啦,窝该睡觉啦~晚安uu们~~

2021.11.24

SThree楠钰子.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序和三三总有一个能跑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值