数组和字符串赋值的问题(定义时不初始化)

在C语言中,字符串就是字符数组,等价于讨论数组。

实际操作中,我们很多时候要输入数组元素的值,我们只能定义数组类型和大小(通常往大了定,保证输入够用),比如int a[100]。而往往课本上很多时候都是定义数组时就进行了初始化,某天下午我突然想理清一下两者的差别,中间犯了许多错误,有些感悟,便写成一篇随笔


数组创建(定义)之后 课本要求我们对数组进行初始化
常见的是一维数组初始化、二维数组初始化、字符数组(字符串)初始化
初始化和初始化部分数组在我以前的笔记都有详细的例子和介绍
(包括不指定数组大小初始化,二维数组初始化等)
C语言 第八章 数组
C语言 第九章 字符串
数组是一定要初始化的(有值的,不然是随机数),主要是讨论定义数组时不初始化的问题。

1 初始化

  • 定义数组后必须要初始化,不要认为不初始化,系统就会自动初始化为0;如果不初始化,局部变量在栈上,各数组元素的值将是随机数;

2 初始化部分数组

  • 数组初始化:程序员至少必须把数组元素的第一个数组元素初始化为0,剩余的元素系统会自动初始化为0; 实际上,把数组初始化为0是在编译时完成的。

  • 初始化值的个数可少于数组元素个数.当初始化值的个数少于数组元素个数时,前面的按序初始化相应值, 后面的初始化为0;

  • 下面两个可不看

  • 一般来说 全局变量、静态变量处于数据区,默认初始化为0 (如果指定初始值,则为指定的值)局部数组根据编译器的特点有所不一样。

  • 静态局部变量和全局变量一样,数据都存放在全局区域,所以在主程序之前,编译器已经为其分配好了内存,在C中,初始化发生在代码执行之前,编译阶段分配好内存之后,就会进行初始化.

3 定义时不初始化数组

定义时不初始化数组

3.1 一个错误

在一个寒冷的下午,故事的开始是我看到这两行代码。太久没学c的我一开始没理解,就开始越挖越深。

int a[5];
a[5] = {10, 20, 30, 40, 50};

这两行代码运行肯定是错误的
首先,我们要明白定义时int a[5]中a[5]的指的是定义一个5个元素的整型数组
然后,之后的a[5]呢,就是指数组a的下标为5的元素了

tips:
1.下标是越界的,长度为5的数组是不会有下标为5的元素的(下标为5的元素是数组中第6个元素)

3.2 错误联想

当时我又想,那a[5]会是一个元素的话,去掉’[5]'会怎么样

int a[5];
a = {10, 20, 30, 40, 50};

试了下这个,问题就更大了,编译器直接error‘ERROR:Array type 'xxxx' is not assignable’
百度一查,寄

a是数组名,只是代表数组第一个元素的地址的值
比如数组 int a[10],a实际上就是 &a[0],它只是一个值,就像 5 这类东西一样,是不能作为左值的,不能给它赋值。在任何时候都不能把数组名直接放在等号的左边

这可是考试大忌,犯一次有利于加深印象(笑)

若想更改数组内容可以使用下标index或指针

3.3 一个检测

在知道上述两种办法行不通后,我做了另一个检测

我们知道,如果定义数组我们才用这句话

int a[10] = {1};
那么结果会是a[0]赋值为1,a[1]到a[9]自动赋值为0

于是就有了想法
如果定义时不初始化,之后给a[0]赋值,其他的元素会自动赋值吗

#include 

int main()
{
    int a[10]; //定义时不初始化
    a[0] = 1; //给其中一个元素赋值

    printf("a[0]=%d\n",a[0]);
    printf("a[1]=%d\n",a[1]);
    return 0;   
}

结果就是

a[0]=1
a[1]=73896
a[0]变为了1,其他的数还是随机数。
因为只改变了a[0]的值,没改变其他的。不会自动给别的数组元素赋值为0。
所以如果不在定义时就初始化数组的话,数组元素全是随机值,后面只能逐个更改

3.5 数组正确的输入赋值方式

这是一个整型数组输入,用空格分割,用回车结束

#include 

int main()
{
    int i = 0, a[15];
    printf("请输入整型数组\n");
    
    for (i = 0; i<= 15; i++)
    {
        scanf("%d", &a[i]);
        char c = getchar(); //用来读入空格
        if(c == '\n') break;  //如果读入的是回车则结束
    }     
    
    //输出确认一下
    printf("数组:\n");
    for (int m = 0; m < i+1; m++)
    {
        printf("%d\t", a[m]) ;      
    }
    return 0;
}

3.6 字符串正确的赋值方式

下面两种都是原字符串有没有值都可以用。

  1. 用字符串函数
    字符串虽然都跟数组一样
    但是在头文件中可以调用字符串函数来实现赋值,没有那么麻烦
    想把字符串t从’rm’换为’te’

char t[5]=“rm”;
t=“te”;

如果是这种想法,就可以从头再看一遍这文章了。
根据数组名是地址,永远不能作为左值可知,字符串名字不能用来赋值

#include 

int main()
{ 
    char t[5]="10";
    //t="te";//数组名是地址,永远不能作为左值
    strcpy(t,"te");
    puts(t);
    return 0;
}

结果是

te

  1. 直接scanf()输入

scanf("%s", t);

没试,用gets()啥的应该都行

你可能感兴趣的