一.一维数组名的含义
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);
}
}
创作不易, 如果这份博客👍对你有帮助,可以给博主一个免费的点赞以示鼓励。
欢迎各位帅哥美女点赞👍评论⭐收藏,谢谢!!!
如果有什么疑问或不同的见解,欢迎在评论区留言哦👀。
祝各位生活愉快⭐