C语言入门篇(六)下

简介: C语言入门篇(六)下

1.3 数组的使用

二维数组的使用也是通过下标的方式:


#include<stdio.h>
int main()
{
  int arr[4][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{5,6,7,8,9} };
  printf("%d\n", arr[2][3]);//6
  return 0;
}

🍤实例:


#include<stdio.h>
int main()
{
  int arr[4][5] = { {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{5,6,7,8,9} };
  int i ;//用i控制行,下标是0-3
  for (i = 0; i < 4; i++)//外循环控制行
  {
    int j ;//j控制列,下标是0-4
    for (j = 0; j < 5; j++)//内循环控制列
    {
      printf("%d ", arr[i][j]);//输出整个数组
    }
    printf("\n");//每行打印完后,换行
  }
  return 0;
}

1.4 数组在内存中的存储

像一维数组一样,这里我们尝试打印二维数组的每个元素:


#include<stdio.h>
int main()
{
  int arr[3][4] = { 0 };
  int i = 0;
  for (i = 0; i < 3; i++)
  {
    int j = 0;
    for (j = 0; j < 4; j++)
    {
      printf("&arr[%d][%d] = %p\n", i, j, &arr[i][j]);
    }
  }
  return 0;
}

运行结果:


e857e61843945bb7072ae869ba897021_94dc9bf9c52449bc842c020773fef900.png


可以发现:二维数组在内存中也是连续存储的


3. 数组越界


数组的下标是有范围限制的。

数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。


数组的下标如果小于0,或者大于n-1,就是数组越界访问了。


比如这段代码:


#include <stdio.h>
int main()
{
 int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    int i = 0;
    for(i=0; i<=10; i++)
   {
        printf("%d\n", arr[i]);//当i等于10的时候,越界访问了
   }
 return 0;
}

🍩二维数组的行和列也可能存在越界。


4. 数组作为函数参数


在写代码的时候,需要将数组作为参数传给函数。


比如:实现一个冒泡排序函数将一个整形数组排序。


冒泡排序:依次比较两个相邻的元素的大小,按照升序或降序排列,重复的比较,直到所有元素排列完成。

996d79becf2e496aa024725a322aabfd.gif


代码实现:


//升序排列
void bubble_sort(int* arr, int sz)//这里的arr的本质是指针
{
  int i = 0;
  for (i = 0; i < sz - 1; i++)//数组下标范围:0-sz-1,
  {
    int j = 0;
    int flag = 1;//假设已经是有序数组
    //进行比较
    for (j = 0; j < sz - 1 - i; j++)
    {
      if (arr[j] > arr[j + 1])
      {
        //交换
        int temp = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = temp;
        flag = 0;
      }
    }
    if (flag == 1)
      break;
  }
}
int main()
{
  int arr[10] = { 0 };
  int i ;
  int sz = sizeof(arr) / sizeof(arr[0]);//计算数组大小
  for (i = 0; i < sz; i++)
  {
    scanf("%d", &arr[i]);//输入
  }
  //arr作为数组进行了传参
  bubble_sort(arr, sz);//arr 是数组首元素的地址,传递的是首元素的地址
  for (i = 0; i < sz; i++)
  {
    printf("%d ", arr[i]);//输出排好序的数组元素
  }
  return 0;
}

当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。


所以即使在函数参数部分写成数组的形式: int arr[] ,其表示的依然是一个指针: int *arr 。


4.1 数组名你用对了吗?

先看一段代码:


//%p--打印地址
int main()
{
  int arr[10] = { 1,2,3};
  printf("%p\n", arr);//首元素地址--arr[0]
  printf("%p\n", arr+1);//arr[1]
  printf("%p\n", &arr[0]);//首元素取地址
  printf("%p\n", &arr[0]+1);//arr[1]
  printf("%p\n", &arr);//数组的地址,是从首元素地址开始的
  printf("%p\n", &arr+1);//数组+1,跳过整个数组
  printf("%d\n", sizeof(arr));//整个数组所占内存空间大小
  return 0;
}

运行结果:


9dab00cbe7e886e5adb242b523169bee_0d8e0d62a9e54c2e8aea3ef0e8492087.png


🍩数组名通常情况下就是数组首元素的地址。


但是有2个例外:


🍥 sizeof(数组名),数组名单独放在sizeof()内部,这里的数组名表示整个数组,计算的是整个数组的大小


🍥 &数组名,这里的数组名也表示整个数组,这里取出的是整个数组的地址


除此之外所有遇到的数组名都表示数组首元素的地址


相关文章
|
2月前
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
68 2
|
18天前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
71 3
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
2月前
|
存储 Java 编译器
初识C语言1——C语言入门介绍
初识C语言1——C语言入门介绍
35 1
|
2月前
|
C语言
回溯入门题,数据所有排列方式(c语言)
回溯入门题,数据所有排列方式(c语言)
|
4月前
|
C语言
C语言------程设设计入门
这篇文章是C语言程序设计的入门教程,涵盖了C程序的实现过程、VC集成开发环境的使用、基本数据类型的使用、格式控制字符的作用,以及通过示例代码演示了如何使用printf()函数输出不同类型的数据。
C语言------程设设计入门
|
5月前
|
存储 Java C语言
【C语言入门】初识C语言:掌握编程的基石
【C语言入门】初识C语言:掌握编程的基石
71 4
【C语言入门】初识C语言:掌握编程的基石
|
4月前
|
NoSQL Java 编译器
C语言从入门到精通该怎样学?
持续学习与实践:编程是一门需要不断学习和实践的技能,要保持对新技术和新知识的敏感性,并持续进行编程实践。
66 1
|
5月前
|
存储 Java 程序员
【C语言入门】C语言入门:探索编程世界的基础概念
【C语言入门】C语言入门:探索编程世界的基础概念
119 2
|
5月前
|
前端开发 C语言 C++
C语言入门02---环境搭建
C语言入门02---环境搭建
|
6月前
|
存储 Web App开发 算法
c语言的简单入门
熟悉c语言(简单入门)