【C】数组——知识点大全(简洁,详细)(二)

简介: 【C】数组——知识点大全(简洁,详细)

八.数组越界的情况

  • 数组的下标有范围限制。数组的规定是从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;
}

十二.数组的实际应用:三子棋

后续更新

相关文章
|
7月前
对数组中的对象进行排序 简洁易懂
对数组中的对象进行排序 简洁易懂
【C】操作符——知识点大全(简洁,全面)(一)
【C】操作符——知识点大全(简洁,全面)
|
存储 C语言
【C】数组——知识点大全(简洁,详细)(一)
【C】数组——知识点大全(简洁,详细)
|
存储 编译器
【C】指针——知识点大全(详细,简洁,含例题)(一)
【C】指针——知识点大全(详细,简洁,含例题)
|
编译器 C语言
【C】结构体+自定义类型知识点大全(基础,进阶,简洁,全面)(一)
【C】结构体+自定义类型知识点大全(基础,进阶,简洁,全面)
【C】结构体+自定义类型知识点大全(基础,进阶,简洁,全面)(二)
【C】结构体+自定义类型知识点大全(基础,进阶,简洁,全面)
【数据结构】-8种排序解析(详细总结,简洁,含代码,例题)(二)
【数据结构】-8种排序解析(详细总结,简洁,含代码,例题)
【数据结构】-8种排序解析(详细总结,简洁,含代码,例题)(一)
【数据结构】-8种排序解析(详细总结,简洁,含代码,例题)