C语言——深入理解指针(2)


请添加图片描述

1.数组名的理解

数组名就是首元素的地址,但是有两个例外:
sizeof(数组名)计算的是整个数组的大小
&数组名,取得的地址是整个数组的地址

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr[6] = { 1,2,3,4,5,6 };
	printf("arr       = %p\n", arr);
	printf("&arr[0]   = %p\n", &arr[0]);
	printf("arr+1     = %p\n", arr+1);
	printf("&arr[0]+1 = %p\n", &arr[0]+1);
	printf("&arr      = %p\n", &arr);
	printf("&arr+1    = %p\n", &arr+1);
	printf("sizeof(arr) = %d\n", sizeof(arr));
	return 0;
}

输出结果

arr       = 00D5F930
&arr[0]   = 00D5F930
arr+1     = 00D5F934
&arr[0]+1 = 00D5F934
&arr      = 00D5F930//16进制,30=3*16=48,
&arr+1    = 00D5F948//16进制,48=4*16+8=72, 72-48=24
sizeof(arr) = 24

2.指针访问数组

访问数组就不再局限于下标引用操作符了 [ ]
如下都相互等价

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
	int arr[6] = { 0 };
	int* p = arr;
	for (int i = 0; i < 6;i++)
	{
		//scanf("%d", &arr[i]);
		//scanf("%d", arr + i);
		//scanf("%d", p + i);
		scanf("%d", &p[i]);
	}

	for (int i = 0; i < 6; i++)
	{
		//printf("%d ", arr[i]);
		//printf("%d ", *(arr + i));
		//printf("%d ", *(p + i));
		printf("%d ", p[i]);
	}
	
	return 0;
}

结论:本质上p[i] 是等价于 *(p+i)

3.一维数组转参的本质

平时遇到,有人写个函数打印数组是这样写的:

#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void Print(int arr[])
{
	int len = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < len; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int arr[6] = { 1,2,3,4,5 };
	int* p = arr;
	Print(arr);
	return 0;
}
输出结果为:1

此时我们意识到这样不对,传递实参arr是首元素地址,所以输出首元素1。因为函数的参数部分是本质是指针,所以在函数内部是没办法求的数组元素个数的。

#include<stdio.h>
void printArr(int* p,int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%d ", p[i]);
	}
}
int main()
{
	int arr[6] = { 1,2,3,4,5 ,6 };
	int len = sizeof(arr) / sizeof(arr[0]);
	printArr(arr,len);

	return 0;
}
输出1 2 3 4 5 6

4.指针数组

指针数组是指针还是数组?
整形数组,整形数组,存放整形的数组,是数组
那指针数组,也是数组,存放指针的。后面还有数组指针哟~
在这里插入图片描述

5.二级指针

存放指针变量的地址

#include<stdio.h>
int main()
{
	int a = 100;
	int* pa = &a;
	int* *ppa = &pa;
	**ppa = 666;
	printf("a = %d\n", a);//a=666

	return 0;
}

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

#include<stdio.h>
int main()
{
	int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };

	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			  printf("%d ", arr[i][j]); 
			  //arr[i] 等价于 *(arr+i)
			//printf("%d ", *(arr[i] + j));
			//printf("%d ", *(*(arr+i)+j));
		}
		printf("\n");
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

我是无敌小恐龙

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

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

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

打赏作者

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

抵扣说明:

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

余额充值