C语言系列 小白入门参考资料 纯原创 深入C语言指针(2)

前言:上篇文章我们讲了关于指针的有关知识,但那些知识还是不足以我们声称自己了解了指针,所以这次我们将继续深入学习。

这次的内容是主要是 数组和指针的 之间的连接。

目录

1.数组名的理解

2.使用指针访问数组 

3.一维数组传参的本质

4.二级指针

5.指针数组


1.数组名的理解

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

 这里的调试结果就印证了,数组名就是首元素的地址。

2.使用指针访问数组 

 我们一般访问数组的时候都是以  例: arr[i] 的形式来访问数组的元素

int arr[10] = { 0 };
for (int i = 0; i < 10; i++)
{
	printf("%d ", arr[i]);
}

但其实指针也可以用来访问数组,而指针可以访问数组的原因是在于数组在内存中连续存放的。

因此就有我们以下的代码

	//使用指针访问数组

	int arr[10] = { 0 };
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
	printf("请输入数组十个元素");
	for (i = 0; i < sz; i++)
	{
		scanf("%d ", arr+i);

		//scanf("%d ", &arr[i]);
		//  输入  数组形式 &arr[i]   指针形式  arr+i
	}

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

		//printf("%d ", arr[i]);
		//  输出  数组形式  arr[i]   指针形式  *(arr + i)
	}

}

假设下面arr数组是int类型,那么每次加一 ,他就跳过4个字节,刚好每次可以访问下一个元素

3.一维数组传参的本质

数组传参的本质是 传入数组首元素的地址

	void print(int arr[10])// 此处 int arr[10] 就等价于 int* arr
	{
		int sz = sizeof(arr) / sizeof(arr[0]);//按照设想此处应是10
		printf("%d\n", sz);
		int i = 0;
		for (i = 0; i < sz; i++)
		{
			//printf("%d ", arr[i]);
		}

	}




	int main()
	{
		int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };

		print(arr);

	}

此处形参 arr是指针变量,所以不可在函数中使用  sizeof(arr) / sizeof(arr[0]) 来求长度,因为虽然被传入的是数组的首元素地址,但接收的是指针变量。而指针变量的大小 是4/8个字节,因此我们无法得到想要的数组长度 

//数组传参时,形参是可以写成数组的形式,也可以写成指针的形式
//
//数组传参的本质是 传入的数组首元素的地址
//所以形参和实参访问的是同一个数组
//
//形参的数组并不会 再单独创建一个空间,因此数组的大小可以忽略 
// 所以形参中的   int arr[10]  可以写成  int arr[]
//
//ps:  地址传递的有一个问题就是 
// 如果形参修改了被传入地址的内容  那么  实参中也会被改变,因为他们共享一个地址


void print(int arr[10], int sz)//  这里的 int arr[10] 实际上就等同于  int* arr
{
	int i = 0;
	for(i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}

}




int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	print(arr, sz);

}

4.二级指针

在之前的文章我们知道了,一级指针就是存放(被指定的)变量的地址。那我们是不是可以类别来考虑二级指针的作用。

二级指针是存放一级指针的地址

那么解引用pp的话     *pp  就是 p的地址 , **pp  就是 a的值。

5.指针数组

指针数组,指针数组,那它到底是指针还是数组呢?

我们还是可以举个"栗子",来理解。

整形数组   是数组   元素类型是int

字符数组   是数组   元素类型是char

那么指针数组    是数组   元素类型是指针

指针数组模拟二维数组 

#include <stdio.h>
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[] = { 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]);
			//arr[i][j] 等价于 *(*(arr+i)+j)
		}

		printf("\n");
	}
}

到此我们的第二篇关于指针的文章就到此结束了。

我是阿泽,也是小罗,更是大家的朋友。如果大家喜欢我的文章,并能帮助大家的话,我会非常开心 。

作者水平有限,所以有不足和需要改进的地方,希望大家可以多多建议。

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值