数组和字符串赋值的问题(定义时不初始化)
数组和字符串赋值的问题(定义时不初始化)
专栏指路
C语言笔记汇总
在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 <stdio.h>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 <stdio.h>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 字符串正确的赋值方式
下面两种都是原字符串有没有值都可以用。
- 用字符串函数
字符串虽然都跟数组一样
但是在头文件<string.h>中可以调用字符串函数来实现赋值,没有那么麻烦
想把字符串t从’rm’换为’te’
char t[5]=“rm”;
t=“te”;
如果是这种想法,就可以从头再看一遍这文章了。
根据数组名是地址,永远不能作为左值
可知,字符串名字不能用来赋值
#include <stdio.h>int main()
{ char t[5]="10";//t="te";//数组名是地址,永远不能作为左值strcpy(t,"te");puts(t);return 0;
}
结果是
te
- 直接scanf()输入
scanf(“%s”, t);
没试,用gets()啥的应该都行
专栏指路
C语言笔记汇总