前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言——指针(三)

C语言——指针(三)

作者头像
用户11029137
发布2024-03-19 15:41:24
660
发布2024-03-19 15:41:24
举报
文章被收录于专栏:编程学习

一,对数组名的理解

取地操作符(&)相信大家都不陌生,例如:

代码语言:javascript
复制
int arr[5]={1,2,3,4,5};
int*p = &arr[0]; //这里我们通过&arr[0]拿到了数组第一个元素的地址

但是,数组名(arr)其实本来就是地址,它代表的是数组首元素的地址。 我们做个测试,运行下面代码观察结果:

代码语言:javascript
复制
int main()
{
	int arr[0] = { 1,2,3,4,5 };
	printf("&arr[0] = %p\n", &arr[0]); //%p是专门用来打印地址的
	printf("arr     = %p\n", arr);
	return 0;
}

我们可以发现:数组名打印出来的结果与&ar[0]一致,这就是因为: 数组名(arr)代表的是数组首元素的地址。 但是,在下面两个情况下(数组名表示整个数组): 1,sizeof(数组名): 当数组名单独放在sizeof里面时,这里的数组名表示的是整个数组。 2,&数组名: 当数组名和&相结合时,这里的数组名表示的是整个数组,取出的是整个数组的地址。 不妨看下面的测试: 测试一(sizeof(数组名)):

输出结果是20,就是因为这里的arr表示的是整个数组,sizeof计算了整个数组的大小:一共5个元素,每个元素是int类型,所以5*4==20。

测试二(&数组名):

输出结果:

我们发现arr与&arr输出的结果是一样的,但是,arr+1跳过了4个字节&arr+1却跳过了20个字节,这是因为: &arr中的arr表示的是整个数组,取出的是整个数组的地址指针的类型是数组指针,因此+1就会一下子跳过整个数组,也就是20个字节(上一讲说到的指针类型会影响指针±整数所跳过的字节数)。

总结: sizeof(数组名)和 &数组名中:数组名表示的整个数组。 除两个特例外,其他情况下的数组名都表示数组首元素的地址

二,指针与一维数组

在前面学习的基础上,我们再来看看数组与指针间的奇妙联系!

1,一维数组传参的本质

假如,我们创造一个函数test,企图用test来实现在函数内部计算数组元素的个数,如下图:

输出结果:

我们发现:sz2的结果并不是我们想要的数组的元素的个数。 为什么同样一段用于计算数组元素个数的代码,在函数外部能实现,到了函数内部求数组元素个数就不行了呢? 这是因为: 数组名是数组首元素的地址,我们在传参时,传递的是数组名,传递的是首元素的地址。 也就是说test函数中sizeof(arr)/sizeof(arr[0])中的sizeof(arr)实现的其实是计算首元素的地址的大小,sizeof(arr[0])计算的是数组首元素的大小,因为我所使用的是x86环境,地址的大小是4个字节,所以:4/4得到了1。

总结:本质上,一维数组传参传递的是数组首元素的地址

void test(int arr[]) 参数上写成数组的形式,本质上还是指针 参数: int arr[] <==> int* arr (形式不同,本质相同)

2,指针访问一维数组

下面举例:

1)用指针变量和指针运算符

我们可以用指针变量和指针运算符实现访问数组 如下,用指针变量输入输出各数组的元素:

代码语言:javascript
复制
int main()
{
	int i, a[5], * p = a;
	//输入:
	for (i = 0; i < 5; i++)
	{
		scanf("%d", p + i);
	}
	printf("\n");
	//输出:
	for (i = 0; i < 5; i++)
	{
		printf("%4d", *(a + i));
	}
	printf("\n");
	return 0;
}

当我们输入1 2 3 4 5结果如下:

当我们输入时,随着i的变化,p+i所代表的地址也在变化,从而不断后移到数组其他元素的地址

2)用指向数组的指针变量的移动
代码语言:javascript
复制
int main()
{
	int i, a[5], * p = a;
	for (i = 0; i < 5; i++)
	{
		scanf("%d",p++);
	}
	printf("\n");
	p = a;
	for (i = 0; i < 5; i++)
	{
		printf("%4d", *p++);
	}
	printf("\n");
	return 0;
}

当我们输入1 2 3 4 5时,结果如下:

这里是通过p++指针变量自身的移动来实现:访问数组中不同地址的元素 ●注意:printf(“%4d”, *p++);中 *p++ 的作用是:先输出指针指向的变量的值,然后指针变量加1

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一,对数组名的理解
  • 二,指针与一维数组
    • 1,一维数组传参的本质
      • 2,指针访问一维数组
        • 1)用指针变量和指针运算符
        • 2)用指向数组的指针变量的移动
    相关产品与服务
    腾讯云服务器利旧
    云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档