C语言--指针与数组--遍历数组的n种方式【详细】


 一.一维数组名的含义

arr一般表示数组的起始地址除了两种例外)

1.在定义数组的同一个函数中(不是形参),求sizeof(arr),求整个数组的字节数
2.在定义数组的同一个函数中(不是形参),&arr+1,加整个数组的大小 (经常考试)
3.除上面以外,arr都表示数组的起始地址(首元素的地址)


 二.指针与数组的互换

上文提到过:arr表示数组的首元素地址,由于如此,数组就和指针扯上了关系

   int *p = arr;有如下互换的情况成立
  *(p+i)==p[i];
  *(arr+i) == arr[i];
   一般建议,尽量使用下标,因为*容易漏掉

 所以有时候,程序中的数组形式其实是个指针,有时候的指针其实想要表达数组,我们只要通过上面的公式转回原来的意思。比如p[i]转换为数组就是arr[i]。

下面的程序表达的都是元素4

int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int* p = &arr[0]; //定义一个指针变量保存数组的首元素地址
	int* p1 = arr;//定义一个指针变量保存数组的首元素地址
	// p===arr 两者可以互换
	printf("%d\n", arr[3]);
	printf("%d\n", p[3]);
	printf("%d\n", *(p + 3));
	printf("%d\n", *(arr + 3));
	return 0;
}


三.遍历数组的n种方式

有两大思路:

1.下标移动

2.指针移动 

 方法一:

 方法二:

方法三:

 方法四:

 方法五:

方法六:

 

//第一种写法:通过下标遍历数组
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0;i < sz;i++)
	{
		printf("%d ", arr[i]);
	}
}


//第二种写法:通过指针遍历数组
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;
	for (int i = 0;i < sz;i++)
	{
		printf("%d ", *p); //不推荐
		p++;
	}
}



//第三种写法:通过指针遍历数组
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;
	for (int i = 0;i < sz;i++)
	{
		printf("%d ", *(p+i)); //指针本身不动,i在动
	}
}


//第四种写法:
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;
	for (int i = 0;i < sz;i++)
	{
		printf("%d ", p[i]); //p[i]==arr[i],指针有时候可以和数组互换,把它转换为数组
	}
}




//第五种写法:
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	int* p = arr;
	for (int i = 0;i < sz;i++)
	{
		printf("%d ", *(arr+i)); //*(p+i)==*(arr+i)==p[i]==arr[i]
	}
}



//第六种写法:
int main()
{
	int arr[5] = { 1,2,3,4,5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	for (int* p = &arr[0];p < &arr[sz];p++) //通过指针移动
	{
		printf("%d ", *p);
	}
}

 创作不易, 如果这份博客👍对你有帮助,可以给博主一个免费的点赞以示鼓励。
欢迎各位帅哥美女点赞👍评论⭐收藏,谢谢!!!
如果有什么疑问或不同的见解,欢迎在评论区留言哦👀。
祝各位生活愉快⭐

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码农小小苏

感谢大佬支持!!!

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

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

打赏作者

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

抵扣说明:

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

余额充值