五大板块(1)—— 数组的定义,赋值与应用

参考:五大板块(1)—— 数组的定义,赋值与应用
作者:丶PURSUING
发布时间: 2021-03-18 16:00:05
网址:https://blog.csdn.net/weixin_44742824/article/details/114981166

数组的定义及访问

完全初始化,部分初始化,不初始化

#include <stdio.h>
#include <string.h>

int main()
{
        int i;
        
        //不初始化
        int array1[10];
        
        //完全初始化
        int array2[5]={1,2,3,4,5};
        
        //部分初始化
        int array3[5]={0};

        for(i=0;i<10;i++){
                printf("%d ",array1[i]);
        }
        putchar('\n');
        
        for(i=0;i<5;i++){
                printf("%d ",array2[i]);
        }
        putchar('\n');
        
        for(i=0;i<5;i++){
                printf("%d ",array3[i]);
        }
        putchar('\n');


        return 0;
}

运行结果:
可以看到不初始化的时候值是随机分配的,不建议采用这种方式。

1996072264 1 0 1995852616 67032 66992 0 66376 0 0 
1 2 3 4 5 
0 0 0 0 0 

 
 
  • 1
  • 2
  • 3

应该采用部分初始化,初始化第一个元素,其他元素的值默认为0

注意:
数组只有在定义的时候[ ]表示个数,其他时候都是下标。
数组的下标是从0开始,即数组的第一个元素是a[0]
数组的最后一个元素是a[i-1]

关于数组赋值,还需要注意:

Ⅰ、大多情况下,数组在定义时必须确定大小

例如类似下面的情景,数组定义时大小是不确定的,妄图通过后续改变的num进行动态赋值,这样的操作往往出现段错误

#include <stdio.h>

int main()
{
        int num;
        int i;
        
        int array[num];
        printf("需要录入的学生人数?\n");
        scanf("%d",&num);
        //int array[num];

        for(i=0;i<num;i++){
                printf("请输入第%d个学生的成绩\n",i+1);
                scanf("%d",&array[i]);
        }

        printf("这些学生的成绩是:");

        for(i=0;i<num;i++){
                printf("%d ",array[i]);
        }

        return 0;
}

结果:

Segmentation fault

 
 
  • 1

是因为只有数组在定义的时候确定了大小,程序才能根据这个大小分配一段连续的内存空间给数组存放数据。

下面为探索过程-----------------👇

哎,我头铁,我就硬是要这样动态赋值!

  • 会不会是一开始num的值不确定导致的呢?做出如下更改
//int num;
int num = 0;

 
 
  • 1
  • 2

结果是没有了段错误,但我选择输入5个学生的成绩,然而输入2或者3个就停下了,这样也不行。如下图:
在这里插入图片描述

  • 那我把数组的定义往下移动,放在scanf后面,等num的值确定了我再定义数组总该可以吧?好想法!
scanf("%d",&num);
int array[num];

 
 
  • 1
  • 2

这样程序的执行虽无问题,但却是一个不好的习惯。

C语言变量的定义最好要放在开头,否则有时候编译器会报错的 ,就是要先定义完变量,再做其他事。(是的,但这通常是发生在写32,51上,Keil的C51所采用的C标准是一个较早期的标准,在程序书写上有较多的限制。)

而在gcc编译器中变量的定义却可以放在程序任何位置。

上面为探索过程-----------------👆

那可咋办呀?我好想进行动态赋值啊。在录入成绩之前用户可以选择录入几个人,而不是在程序中写死,不香吗??

有啊,别用数组了,用指针呗
#include <stdlib.h>
#include <string.h>

int main()
{
        int num;
        int i;

        int *parray = NULL;//防止野指针
        printf("需要录入的学生人数?\n");
        scanf("%d",&num);
      
        //      游标卡尺    开辟空间大小
        parray = (int *)malloc(sizeof(int) * num);//开辟空间 字节为单位 malloc前相当于游标卡尺
        memset(parray,0,sizeof(int) * num);//空间初始化

        for(i=0;i<num;i++){
                printf("请输入第%d个学生的成绩\n",i+1);
                scanf("%d",parray++);
        }

        printf("这些学生的成绩是:");

        parray -= num;//指针回调,少了这个输出都是0
        for(i=0;i<num;i++){
                printf("%d ",*parray++);
        }

        return 0;
}

parray++的时候指针已经到达所指向地址空间边界,要parray -= num回调才能读到里面的值。
在这里插入图片描述

结果:

zhu@ubuntu:~/Desktop$ ./a.out 
需要录入的学生人数?
6
请输入第1个学生的成绩
65
请输入第2个学生的成绩
76
请输入第3个学生的成绩
54
请输入第4个学生的成绩
76
请输入第5个学生的成绩
87
请输入第6个学生的成绩
65
这些学生的成绩是:65 76 54 76 87 65

Ⅱ 、数组的定义在下面三种情况下不需要指明大小

①数组是形式参数

正是下文中数组的简单应用第3个例子

②数组声明的同时进行了初始化
int a[] = {0,1,2,3};

 
 
  • 1

根据实际情况,自动分配大小

③数组的存储类型为extern

嘿嘿,目前还没用过,用了来更新。

Ⅲ、也不能直接给数组赋值字符串

这个在下文中结构体的三种定义赋值方法也有涉及,这个情况也多见于结构体。

大致是这样

#include <stdio.h>

int main()
{
        char array[128] = {0};
        array = "clc mei wo shuai";
        printf("%s\n",array);
        
        return 0;
}

或者这样(这是可以的,前作者有误)

#include <stdio.h>

int main()
{
        char array[128] = "clc mei wo shuai";
        //array = "clc mei wo shuai";
        printf("%s\n",array);

        return 0;
}

都会提示错误:对具有数组类型的表达式赋值

error: assignment to expression with array type

 
 
  • 1
用strcpy函数
#include <stdio.h>
#include <string.h>

int main()
{
        char array[128] = {0};
        strcpy(array,"clc mei wo shuai");
        printf("%s\n",array);

        return 0;
}

成功:

clc mei wo shuai

 
 
  • 1

数组的简单应用

1到100的和(数组的赋值)

#include <stdio.h>

int main()
{
        int i;
        int sum;
        int array[100];
        for(i=1;i<=100;i++){
                array[i-1]=i;
        }
        for(i=0;i<=99;i++){
                sum+=array[i];
        }
        printf("sum=%d\n",sum);
        return 0;
}

比较5个数的大小(数组的遍历)

#include <stdio.h>

int main()
{
        int array[5];
        int max,min;
        int i;
        for(i=0;i<5;i++){
                printf("请输入%d个数\n",i+1);
                scanf("%d",&array[i]);
        }
        max=array[0];
        min=array[0];

        for(i=0;i<5;i++){
                if(max < array[i]){
                        max = array[i];
                }
                if(min > array[i]){
                        min = array[i];
                }
        }

        printf("max=%d,min=%d\n",max,min);


        return 0;
}

数组作为子函数的形式参数以及数组元素个数计算

#include <stdio.h>

int arraySum(int array[],int num)//数组形参,仅仅传递数组的首地址,代表不了个数。  数组内空间连续
{
        int sum;
        int i;
        for(i=0;i<num;i++){
                sum+=array[i];
        }
        return sum;
}

int main()
{
        int sum;
        int array[5]={0,1,2,3,4};

//      sum=arraySum(array,sizeof(array)/sizeof(array[0]));    //传递数组名
        sum=arraySum(&array[0],sizeof(array)/sizeof(array[0]));//或者传递首元素的地址(&)
                                //sizeof里面只能传入数组名                                                  
                    
        printf("sum=%d\n",sum);

        return 0;
}

①数组形参,仅仅传递数组的首地址,代表不了个数(所以个数不必写出)。
②传入数组有两种方式:传入数组首个元素的地址(&) / 数组名
③而用 sizeof 计算数组大小只能传入数组名
④计算数组个数:数组大小 / 数组中某个元素的大小(sizeof(array)/sizeof(array[0]

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行稳方能走远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值