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

C语言进阶指针(2)(超详细)

作者头像
用户11036582
发布2024-03-21 18:27:32
790
发布2024-03-21 18:27:32
举报
文章被收录于专栏:跟我一起学编程

先给大家分享一句我很喜欢我话: 知不足而奋进,望远山而前行!!! 铁铁们,成功的路上必然是孤独且艰难的,但是我们不可以放弃,远山就在前方,但我们能力仍然不足,所有我们更要奋进前行!!! 今天我们更新了指针进阶的内容, 🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

 前言:

在上篇博客中,我们对指针和数组的应用有了一些简单的,这次我们将对他们有一个更详细的解释。

一、数组名的理解

什么是数组名?我们平常经常说数组名就是数组首元素的地址,那到底是不是这样呢?

那我们写一串代码是不是这样呢?

代码语言:javascript
复制
int main()
{
	int arr[10] = { 0 };
	printf("arr     =%p\n", arr);
	printf("&arr[0] =%p\n", &arr[0]);

	return 0;
}

 由此可得,两者在数值上是相等的,所以数组名就是数组首元素(第一个元素)的地址

 这是侯可能有人会疑问,如果数组名是首元素地址,那么下面这串代码怎么解释:

代码语言:javascript
复制
#include<stdio.h>

int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d\n",sizeof(arr));

return 0;
}

这串代码运行结果为40,如果arr指的是首元素,那为什么不是4呢?

这就要看sizeof了,sizeof中单独放数组名时,这里的数组名便表示整个数组,计算的是整个数组的大小,单位是字节。

&数组名,这里的数组名表示整个数组,取出的是整个数组的地址(整个数组的地址和数组首元素的地址是有区别的)。

所以除了sizefo和&这两种情况,其他情况数组名都代表着首元素地址

二、使用指针访问数组

有了前面知识的铺垫,再结合数组的特点,我们就可以很方便的使用指针访问数组了。

下面我们来看一串代码,看之前,我再给大家强调一些知识点:

数组在内存中是连续存放的

数组名是地址,是首元素的地址

可以使用指针来访问数组

指针的+-整数运算,方便我们获得每一个元素的地址

代码语言:javascript
复制
int main()
{
	int arr[10] = { 0 };
	int i = 0;
	int* p = arr;
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (i = 0; i < sz; i++) {
		scanf("%d", p+i);//p+i==&arr[i]
	}

	for (int i = 0; i < sz; i++) {
		printf("%d ", *(p + i));
	}

	return 0;
}

这串代码可看出,p就代表着&arr,可借用p对arr进行赋值。

       并且arr[i]与*(arr+i)两种写法是完全等价的。

因此*(i+arr)与上面两种写法也是相同的,所以我们肯定都会想到,将数组写成i[arr]这种形式可以吗?

我们来试一下:

 这样来看结果也是可以的。

三、一维数组传参的本质

数组传参时,我们常能看到两种写法,

1.void Print(int*arr); 2.void Print(int arr[10]);

其实对于这两种写法,传过去的都是指针变量,无论写成什么样子。传参传的都是指针变量

即使按第二种写法,也无法将元素个数传过去。

所以数组传参时传过去的是首元素地址。

我们还要记住一点:形参的数组是不会单独再创建数组空间的,所以形参的数组是可以省略掉数组大小的。

四、二级指针

指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里呢?

这就是二级指针:

看一下这张图片中的代码,可以先熟悉一下二级指针。

这次我们这是先认识一下二级指针,以后我们会对二级指针有一个更加深入的讲解。

当然还有三级指针。

五、指针数组模拟二维数组

指针数组是指针还是数组呢?

整形数组-存放整形的数组。

字符数组-存放字符的数组。

所以指针数组-就是存放指针的数组。

代码语言:javascript
复制
//指针数组模拟二维数组
int main()
{
	int arr1[] = { 1,2,3,4,5 };
	int arr2[] = { 2,3,4,5,6 };
	int arr3[] = { 3,4,5,6,7 };

	int* arr[3] = { arr1,arr2,arr3 };
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++) {
		for (j = 0; j < 5; j++) {
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}

	return 0;
}

1.arr的第一个数组里放arr1的首元素地址 2.arr每个元素的类型是int*。 3.该数组里每个元素都是指针,所以它是一个指针数组 4.arr[i][j],也可以写成arr[i]+j, 5.相当于地址+j为向后挨个元素指向

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  •  前言:
  • 一、数组名的理解
  • 二、使用指针访问数组
  • 三、一维数组传参的本质
  • 四、二级指针
  • 五、指针数组模拟二维数组
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档