八.数组越界的情况
- 数组的下标有范围限制。数组的规定是从0开始,如果数组有n个元素,最后一个元素的下标就是n-1。如果数组的下标小于0或者大于n-1,数组越界访问。
- C语言本身不做数组下标的越界检查,编译器不一定报错
九.数组名要点
1.数组名是首元素的地址(存在两个例外)
sizeof(arr),数组名表示整个数组,计算的是整个数组的大小
&arr,数组名表示整个数组,取出的是整个数组的地址
除此之外,遇到的数组名都是数组首元素的地址
2.arr,&arr[0],&arr的区别(以及它们+1后的含义)
arr与&arr[0]等效,表示首元素的地址
&arr表示数组的地址
PS:arr[n]表示第n+1个数组元素
代码演示:
int arr[10]={0}; printf("%p\n",arr);首元素的地址 printf("%p\n",arr+1);首元素的地址+1 printf("%p\n",&arr[0]);首元素的地址 printf("%p\n",&arr[0]+1);首元素的地址+1 printf("%p\n",&arr);数组的地址 printf("%p\n",&arr+1);数组结尾下一个的地址
十.打印数组的两种写法
int arr[10]={1,2,3,4,5,6,7,8,9,10}; int*p=&arr[0]; p为首元素地址 int*p=arr;
法一:利用下标引用操作符[](元素本身)
for(int i=0;i<10;i++) { printf("%d",arr[i]); }
法二:解引用首元素地址(数组名/p)
//int*p=&arr[0]; p为首元素地址 for(int i=0;i<10;i++) { printf("%d",*(p+i)); printf("%d",*(arr+i)); }
原理图示:
小拓展:加法交换律的写法
- arr[i]等效于i[arr]
int arr[10]={1,2,3,4,5,6,7,8,9,10}; for(int i=0;i<10;i++) { printf("%d",arr[i]); arr[i]--->*(arr+i)---->*(i+arr) printf("%d",i[arr]) }
十一.数组作为函数参数时
1.传参的两种形式
二者等效:
1. void bubble_sort(int* arr); 2. void bubble_sort(int arr[10]);
1.数组在传参的时候会发生数组名的降级(冒泡排序演示)
一:无法排序的情况
void bubble_sort(int arr[10]) { //求数组的元素个数 int sz=sizeof(arr)/sizeof(arr[0]); 问题点:此时的arr不再是数组,已经降级 //冒泡排序的趟数 int i=0; for(i=0;i<sz-1;i++) { int j=0; for(j=0;j<sz-1-i;j++) { if(arr[j]>arr[j+1]) { int tmp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=tmp; } } } } int main() { int arr[]={3,1,7,5,8,9,0,2,4,6}; bubble_sort(arr); for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++) { printf("%d",arr[i]); } return 0; }
二:解决方式:别在函数内部求数组的个数
void bubble_sort(int arr[10]) { //冒泡排序的趟数 int i=0; for(i=0;i<sz-1;i++) { int j=0; for(j=0;j<sz-1-i;j++) { if(arr[j]>arr[j+1]) { int tmp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=tmp; } } } } int main() { int arr[]={3,1,7,5,8,9,0,2,4,6}; bubble_sort(arr); //求数组的元素个数 int sz=sizeof(arr)/sizeof(arr[0]); 改变点:此时arr为数组 for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++) { printf("%d",arr[i]); } return 0; }
十二.数组的实际应用:三子棋
后续更新