C杂讲 数组元素指针

目录

 知识点1【数组元素的指针】

 知识点2【数组的[]和*()的关系】(重要)

知识点3【arr 和 &arr的区别】(了解)

知识点4【指向同一数组的两个元素的指针变量 间关系】

 知识点1【数组元素的指针】

 案例:通过数组元素的指针变量 遍历 数组的元素

void test05()
{
	int arr[5]={10,20,30,40,50};
	int n = sizeof(arr)/sizeof(arr[0]);
	int i=0;

	//p保存了 第0个元素的地址(首元素的地址)
	int *p = &arr[0];
	printf("*p = %d\n", *p);//10

	p++;//p=p+1
	printf("*p = %d\n", *p);//20

    //前提是p保存的是第0个元素的地址
	p=&arr[0];
	for(i=0;i<n;i++)
	{
		//printf("%d ", arr[i]);
		//p+i代表的是第i个元素的地址
		//*(p+i)代表的是第i个元素的值
		printf("%d ", *(p+i) );
	}
	printf("\n");
}

运行结果:

 案例提高:

void test06()
{
	int arr[5]={10,20,30,40,50};
	int *p = &arr[1];
	p++;
	p++;
	printf("%d\n", *(p+1));//50
}

运行结果:50

案例:通过数组元素的指针变量给数组的元素 获取键盘输入

void test07()
{
	int arr[5]={0};
	int n = sizeof(arr)/sizeof(arr[0]);
	int i=0;
	int *p = &arr[0];

	printf("请输入%d个int数据\n",n);
	for(i=0;i<n;i++)
	{
		//scanf("%d", &arr[i]);
		scanf("%d", p+i);//p+i == &arr[i]
	}
	
	for(i=0;i<n;i++)
	{
		printf("%d ",*(p+i));
	}
	printf("\n");

}

运行结果:

 知识点2【数组的[]和*()的关系】(重要)

void test08()
{	
	//数组名arr 作为类型 代表的是数组的总大小 sizeof(arr)
	//数组名arr 作为地址 代表的是首元素地址(第0个元素的地址)
	int arr[5]={10,20,30,40,50};
	int n = sizeof(arr)/sizeof(arr[0]);
	int *p = NULL;

	//p = &arr[0];//arr == &arr[0]
	p = arr;

	//在使用中 本质:[] 是*( ) 缩写
	//缩写规则:+左边的值 放在[]左边边  +右边的值 放在[]里面
	printf("arr[1]=%d\n",arr[1]);//20
	printf("arr[1]=%d\n",*(arr+1));//20
	printf("-------------------------\n");
	printf("arr[1]=%d\n",*(1+arr));//20 
	printf("arr[1]=%d\n",1[arr] );//20

	//为啥 arr代表的是  第0个元素的地址(&arr[0])
	//&arr[0] == &*(arr+0) == arr+0 == arr
	//所以:数组名arr代表第0个元素的地址
}

总结:

        1、【】是*()的缩写

        2、数组名arr 代表的是数组 首元素地址(第0个元素的地址)

知识点3【arr 和 &arr的区别】(了解)

arr:数组的首元素地址

&arr:数组的首地址

void test09()
{
	int arr[5]={10,20,30,40,50};
	printf("arr = %u\n",arr);
	printf("arr+1 = %u\n",arr+1);
	printf("-------------\n");
	printf("&arr = %u\n",&arr);
	printf("&arr+1 = %u\n",&arr+1);
}

运行结果:

 数组名arr 是一个符号常量。不能被赋值。

void test10()
{
	int arr[5]={10,20,30,40,50};
	//arr=1000;//err arr符号常量 不能被赋值
 
	//arr++;//arr=arr+1; err
	arr+1;//ok
}

知识点4【指向同一数组的两个元素的指针变量 间关系】

void test11()
{
	int arr[5]={10,20,30,40,50};
	int *p1 = arr;
	int *p2 = arr+3;
	//1、指向同一数组的两个指针变量相减 返回的是相差元素的个数
	printf("%d\n",p2-p1);//3

	//2、指向同一数组的两个指针变量 可以比较大小 > < >= <= == !=
	if(p2>p1)
	{
		printf(">\n");
	}
	else
	{
		printf("<=\n");
	}
	//3、指向同一数组的两个指针变量 可以赋值
	p1=p2;//p1 和 p2指向同一处

	//4、指向同一数组的两个指针变量 尽量不要相加
	printf("p2=%u\n",p2);
	//p1+p2;//err 越界很厉害了

	//5、[]里面在不越界的情况下 可以为负数
	printf("%d\n",p2[-2]);//20
}

案例:

void test12()
{
	int arr[5]={10,20,30,40,50};
	int *p = arr;

	printf("%d\n", *p++);//10
	printf("%d\n", (*p)++);//20
	printf("%d\n", *(p++));//21
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值