这些关于数组的基础知识点你都知道吗?

各位同学,你觉得你数组学会了吗?不妨看看下面的问题,你能看一眼程序就回答上来吗?

引子:观察下面的程序,这个程序有安全隐患吗?

#include<stdio.h>

int main() {

    int x = 0;
    double sum = 0;
    int number[100] = { 0 };
    int cnt = 0;

    scanf("%d", &x);
    while (x != -1) {
        number[cnt] = x;
        sum += x;
        cnt++;
        scanf("%d", &x);
    }

    if (cnt > 0) {
        int i = 0;
        double average = sum / cnt;
        for (i = 0; i < cnt; i++) {
            if (number[i] > average)
                printf("number %d: %d\n", i, number[i]);
        }
    }

答案是有的 while循环种没有限制 cnt 有可能导致 数组越界

不能快速找到错误和找不到错误其实是一样的,因为不能快速找到这个错误说明你没有深刻的理解数组。这种基础的概念如果没有渗透到你的脑中,并不能说自己学好了数组吧!我学了一学期C,课设1000行代码都是自己独立完成的。依然没有立刻看出这个问题来,我也是自愧没有学好啊!

数组特性与一个注意

1.数组是一种容器(放东西的东西)
2.基本特点是:

  • 其中所有元素具有相同的数据类型
  • 一旦创建,不能改变大小
  • 在内存中连续依次排列

3.注意:
数组作为函数参数时,往往必须再用另一个参数来传入数组的大小
我们常用sizeof(arr) / sizeof(arr[0])来判断数组元素个数
但是这种情况下不能在函数中用sizeof(arr)判断数组大小

例1

//写一个程序,输入数量不确定的【0 ~ 9】范围内的整数,统计每一种数字出现的次数,输入 -1 表示结束

方法一:先看一个基础做法
#include<stdio.h>

int main() {

    const int number = 10;//记录数组元素。用const修饰,数组大小规定后不可改变
    int count[10] = { 0 };
    int i = 0;
    int input = 1;

    while (input + 1) {//避免输入0时退出,-1 + 1 = 0 刚好满足退出要求
        printf("input a number\n");
        scanf("%d",&input);
        switch (input) {
            case 0:
                count[0]++;
                break;
            case 1:
                count[1]++;
                break;
            case 2:
                count[2]++;
                break;
            case 3:
                count[3]++;
                break;
            case 4:
                count[4]++;
                break;
            case 5:
                count[5]++;
                break;
            case 6:
                count[6]++;
                break;
            case 7:
                count[7]++;
                break;
            case 8:
                count[8]++;
                break;
            case 9:
                count[9]++;
                break;
             default:
                 break;
        }

    

    for (i = 0; i < 10; i++) 
        printf("%d:%d times\n", i, count[i]);
    
    return 0;
}
方法2

当我们要统计的数是像 0 ~ 9 这样连续的数时,我们可以把数组下标与这些数一一对应起来,可以更方便,快捷

#include<stdio.h>

int main() {

    int count[10] = { 0 };
    int i = 0;
    int input = 1;
    int error = 0;

    
    //更简单的方法:
    while (input + 1) {
        printf("input a number\n");
        scanf("%d", &input);
        if (input >= 0 && input <= 9)
            count[input]++;
        if (input == -1) 
                break;
    }

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

    return 0;
}

思考一下:字符常量可以做数组下标吗?
例如,形如arr['a'] 可以吗?

如果可以,那么当我们想要统计字符串中某个字母(或者任何ASCII码表上存在的字符)的具体个数时,就会很方便。可以自己尝试着写一下哦~思路和上面的数字判断差不多。
我写的供大家参考:https://github.com/hairrrrr/win.ccode/blob/master/Pactise/2020WinterVacation/Array/%E7%BB%9F%E8%AE%A1%E6%AF%8F%E4%B8%AA%E5%AD%97%E6%AF%8D%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%E6%95%B0%EF%BC%88%E5%8F%AF%E6%8B%93%E5%B1%95%E5%88%B0%E7%BB%9F%E8%AE%A1%E6%89%80%E6%9C%89ascii%E8%A1%A8%E5%86%85%E5%87%BA%E7%8E%B0%E7%9A%84%E5%AD%97%E7%AC%A6%E6%AC%A1%E6%95%B0%EF%BC%89.c


例2

#include<stdio.h>

#define N 10 //数组元素个数

int search(int want, int lenth, int* arr) {

    int right = lenth - 1;
    int left = 0;
    int mid = 0;
    int ret = 0;

    while (right >= left) {
        mid = (right + left) / 2;
        if (want > arr[mid])
            left = mid + 1;
        if (want < arr[mid])
            right = mid - 1;
        if (want == arr[mid]) {
            ret = mid;
            break;
        }
        
    }

    if (right < left)
        return -1;
    else
        return ret;
}

int main() {

    int arr[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int lenth = sizeof(arr) / sizeof(arr[0]);//计算数组大小
    int want = 0;
    int index = 0;

    printf("input the number you want to search\n");
    scanf("%d", &want);

    index = search(want, lenth, arr);//切记:数组作为函数参数时,往往必须再用另一个参数来传入数组的大小
    
    if (index == -1)
        printf("Can't find!\n");
    else
        printf("the index of %d: %d\n", want, index);

    return 0;
}

二维数组

1.初始化

int a[][3] = {{1, 1, 1}, {2, 2, 2}, {3},}
1.列数必须给出,行数可以空出
2.每行都有有一个单独的大括号 { }(可以不写,建议写上)
3.最后的逗号可以写上,老一代程序员们约定俗成的经验(如果你写上,可以装装逼)
4.缺省表示补零
5.强烈推荐的另一种书写方式:

<pre style="margin: 0px; padding: 0px;">int a[][3] = {
{1, 1, 1},
{2, 2, 2},
{3},
}</pre>

这样写的好处不言而喻,更加形象立体

练习题

1.

若有定义:int a[2][3].则下列不越界的正确访问有:
A: a[2][0]
B: a[2][3]
C: a[1 > 2][0]
D: a[0][3]

2.

以下程序片段输出的结果是:

int m[][3] = {1, 4, 7, 2, 5, 8, 3, 6, 9,}
     int i, j, k = 2;for( i = 0; i < 3; i++){    
     printf("%d",m[k][j]);
}

A: 369
B: 不能通过编译
C:789
D:能编译,但是数组下标越界了

3

若有int a[][3] = {{0}, {1}, {2}};
a[1][2] 的值是?

答案:C A 0

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容