• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

XiaoXiaoli

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

c_数组

数组的特点:c语言中有基本类型和构造类型,数组属于构造类型,结构体也属于构造类型。数组的数据结构特点是,在内存中是连续,用来存放相同数据类型。

本文从一维数组、二维数组、字符数组、数组名、数组越界来介绍。

一维数组 从定义、初始化、元素引用介绍。

定义

[存储类型] 数据类型 合法的标识符[下标(整型的常量表达式或整型常量)]

初始化

1.数组未初始化时,其元素值为随机值。数组在内存中是连续的内存空间。

数组未初始化,其元素值为随机值。

#include <stdio.h>
#include <stdlib.h>

int main(){
    /*数组n未进行初始化*/
    int n[3];
    int i=0;
    for(i=0;i<3;i++){
        printf("n[%d],value=[%d]\n", i,n[i]);
    }
    
    /*数组m进行初始化*/
    int m[3] = {0};
    for(i=0;i<3;i++){
                printf("m[%d],value=[%d]\n", i,m[i]);
        }
    return 0;
}

代码输出结果如下,证明了数组元素未初始化时,数组中的值都是随机值。

 

数组在内存中是连续的内存空间。

#include <stdio.h>
#include <stdlib.h>

int main(){
    int n[3];
    int i=0;
    for(i=0;i<3;i++){
        printf("n[%d],address=[%p]\n", i,&n[i]);
    }
    return 0;
}

代码输出,如下。

其输出结果证明了数组在内存中是连续存储,同时数组未初始化时元素的值在内存中为随机值。

2.数组元素全部初始化,数组元素部分初始化。

(1)数组元素部分初始化举例说明,代码如下。

输出结果,如下。

输出结果说明了,部分初始化是按照数组中元素的存储位置进行赋值的。

(2)通过scanf给数组元素赋值,代码如下。

代码输出结果,如下。

这里有一个小知识点,scanf中如果不指定格式化符号,那么你输入的如空格等会变成分隔符。

3. static定义数组

如果不是static初始化,其类型为auto类型,那么元素的值是随机值。如果是static初始化,即使不给元素初始化,那么元素会被初始化为0。

代码说明,如下。

代码输出结果,如下。

输出结果证明了,static定义数组,数组就会被初始化为0即使对数组不进行初始化。

数组元素引用

对于数组中元素的访问使用的是数组的下标。数组名[下标],下标是从0开始。通过指针也可以进行引用。

数组名 数组名是当前数组的起始位置。

代码举例说明,如下。

代码输出,如下。

从输出结果中我们可以看出,数组名的地址和数组首元素地址的值相同。由此可以看出数组名就是当前数组的首地址即当前数组的起始位置。

 2 数组名是一个表示地址的常量,也是数组的起始位置,在程序中定义数组后,不能再使用数组名放在等号左边进行赋值。

数组越界

实际在c语言中,数组取值有一个等式,arr[i] = *(arr+i),即使用指针进行运算并解引用,获取相应地址的值。

下面使用代码,如下。

代码的输出结果如下。

从代码中我们可以看出,数组中有3个元素,其中都初始化赋值了。但是在for循环中,我们循环了四次,也就意味着arr[3]并不是数组的元素。

奇怪的是打印时,其arr[3]却有值,这个值是由地址偏移找到的,arr[i] = *(arr+i)中不管i的值多大,表达式*(arr+i)总是成立,并且能打印出值。

一维数组的练习题

1.求斐波拉契数列的前10项,并在数组中逆序排放。

斐波那契数列的规律为,每个数都是前两个数的相加。

 这里编程需要注意数组的下标和元素的位置的关系,也就是说第3个元素其实它对应的下标为2。

#include <stdio.h>
#include <stdlib.h>

static void fobonacc(){
        int fobo[10] = {0};
        fobo[0] = 1;
        fobo[1] = 1;
        int i = 0;
        for(i=2;i<10;i++){
                fobo[i] = fobo[i-1] + fobo[i-2];
        }

        for(i=0;i<10;i++){
                printf("%d ", fobo[i]);
        }
        printf("\n");

}

2.数据排序 冒泡排序  选择排序 快速排序 

 

3.进制转换

 

4.删除法求质数

 

字符数组的定义、初始化、存储特点。

字符数组的定义

字符数组的初始化

  单个字符初始化。

  字符串常量初始化。

字符数组的输入、输出。

字符数组的常用函数。

 

posted on 2020-12-01 23:18  XiaoXiaoli  阅读(189)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3