C语言指针(二)

一、数组名的理解

1.数组名的理解

通过前面指针1的学习我们知道数组名是数组首元素的地址

而数组的地址和数组首元素的地址都是从首元素地址开始。

我们看到三个代码的运行结果是一样的,所以数组名是数组首元素的地址,但是他们有什么区别呢? 我们可以用一个代码来观察。

其结果与前面一对比发现:前2个各加4个字节,第三个加40个字节,这是因为&arr是数组整个地址,所以加1会跳过40个字节,而&arr[0]和arr是数组首元素的地址, 所以加1会跳过4个字节。

但也有两个例外,并不是所有数组名都是首元素地址:

1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。

2.&数组名,这里的数组名也表示整个数组,取出的是整个数组的地址。

除此之外,所有的数组名都是数组首元素的地址。

2.指针访问数组

int main()
{
	int arr[10] = { 0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = &arr[0];//也可写成arr,因为数组名是数组首元素地址
	int i = 0;

	//输入
	for (i = 0; i < sz; i++)
	{
		scanf("%d", arr+i);//可以写成p+i
	}

	//输出
	for (i = 0; i < sz; i++)
	{
		printf("%d ",i[arr]);//*(arr+i)==arr[i]==i[arr]
	}
	return 0;
}

这串代码中输出程序中 ,i[arr]其实等价于i+arr,i+arr == arr+i == arr[i] == *(arr+i) == *(i+arr);

这里通过指针访问数组元素,*(数组名+下标),这种写法与arr[i]等价,数组名是数组首元素地址,对地址+下标数,地址就会跳转到该数字对应的下标元素位置。

二、一维数组传参的本质

我们通过一个代码来观察:

//一维数组传参的本质:数组名是数组首元素的地址,传参穿的是数组名,所以实际上传递的是首元素地址,
//我们知道一个元素有4个字节,所以通过sizeof函数计算后结果为4.
void print(int arr[])//这里也可写成int* arr
{
	int sz1 = sizeof(arr) / sizeof(arr[0]);//4/4=1
	printf("sz1=%d\n", sz1);//1

}

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

通过上面的代码我们知道sz1和sz2的结果并不一样,sz1 = 1;sz2 = 10;这是为什么呢?

通过前面的学习我们知道数组名是数组首元素的地址,而又结合sz1=1,我们可以得出:一维数组在传递参数的时候,并不是将整个数组给传递过去,而是将数组名也就是数组首元素的地址传递过去作为参数,所以一维数组传参的本质是传递了数组首元素的地址。

而我们知道地址可以用指针变量来接受,所以int arr[ ]其实就是int* arr;所以以后我们写代码可以将参数的部分写成指针形式,也可以写成数组的形式

三、二级指针

地址存放在指针变量当中,而指针变量也是变量,那指针变量又可以存放在哪里呢?

所以我们引出二级指针概念,二级指针是用来存放指针变量的,将指针变量的地址存放在二级指针中。

int** ppa = &pa; 

 

四、指针数组

1.指针数组

int *p [10] = {arr1,arr2,arr3};

是存放指针的数组,每个元素都是指针类型。

 2.指针数组模拟二维数组

//指针数组模拟二维数组,指针数组的每一个元素都是地址,记住:数组名是数组首元素的地址。
int main()
{
	int arr1[5] = { 1,2,3,4,5 };
	int arr2[5] = { 2,3,4,5,6 };
	int arr3[5] = { 3,4,5,6,7 };
	int* parr[3] = { arr1,arr2,arr3 };
	int i = 0;
	int j = 0;
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 5; j++)
		{
			printf("%d ", parr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

parr[i]访问的是存放在parr数组中的元素(arr1,arr2,arr3这些一维数组),而parr[i][j] 则是访问整型一维数组中的元素。

到这里今天指针二的学习就结束了,相信大家又进步了一些,只要每天进步一点点,积少成多,你一定变得很厉害!

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值