当前位置:网站首页>数组和字符串赋值的问题(定义时不初始化)
数组和字符串赋值的问题(定义时不初始化)
2022-07-15 16:40:00 【丸丸丸子w】
在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()啥的应该都行
边栏推荐
- CasADi——数据类型详解与基本操作介绍
- "Immersive" accommodation experience - new bottle of hotel, old wine of B & B
- TCP 三次握手、四次挥手图解
- flask基本用法
- New usage and deconstruction assignment of data types
- How to break the magic spell with a good hand in the strong B & B industry?
- room android sqlite
- What app should individuals use to buy stocks is safer and faster
- Canal realizes real-time synchronization of data from Mysql to es
- freeswitch的话单模块
猜你喜欢

要想不踩SaaS那些坑,得先了解“SaaS架构”

flink. 14. How is the underlying layer of datastream module source implemented?

关于结构体,枚举,联合等自定义类型的笔记

图扑 Web 可视化引擎在仿真分析领域的应用
![[Mori city] random talk on GIS data (IV) - coordinate system](/img/c8/9c58be36247c59582bd4c645ba3774.jpg)
[Mori city] random talk on GIS data (IV) - coordinate system

Application of Tupu web visualization engine in simulation analysis field

看完这5个理由,我终于知道FTP被替代的原因

scala Object关键字声明的类直接调用方法、伴生对象

TimeSformer: 只靠 Transformer 就能理解视频?注意力机制的又一次进击

MP4 file introduction
随机推荐
room android sqlite
How to break the magic spell with a good hand in the strong B & B industry?
fink. 15 complete set of dataset module operators
MySQL-索引
软件研发效能需求价值流分析专题
国产之光!高分时空表征学习模型 UniFormer
centernet(objects as points)的尝试[基于tf.slim]
Special topic of software R & D efficiency demand value stream analysis
CVXPY——最新版问题
RuntimeWarning: overflow encountered in long_scalars h = 12.0 / (totaln * (totaln + 1)) * ssbn - 3
循环语句及数组
GridSearchCV报错:ValueError: Input contains NaN, infinity or a value too large for dtype(‘float64‘).
关于结构体,枚举,联合等自定义类型的笔记
PM 和 PO 有什么区别&&PMO的中文含义
MySQL数据库安装&问题
fink.15 DataSet模块 算子大全
2pc and 3pc of consistency agreement
读书笔记:《过程咨询 I II III》 回顾
Explanation of smart factory terms
TCP 三次握手、四次挥手图解