专栏指路

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 字符串正确的赋值方式

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

  1. 用字符串函数
    字符串虽然都跟数组一样
    但是在头文件<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

  1. 直接scanf()输入

scanf(“%s”, t);

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

专栏指路

C语言笔记汇总

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

  1. 字符型指针,数组,字符串赋值

    一. C语言中,为什么字符串可以赋值给字符指针变量 char *p,a='5'; p=&a;                     //显然是正确的, p="abcd"; ...

  2. JAVA 构造 MAP 并初始化 MAP、定义时就初始化

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 第一种方法:static块初始化 public class Demo{private static ...

  3. android 数组赋值字符串_c语言中的字符数组与字符串

    1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y ...

  4. C语言的字符数组(字符串)的定义与初始化

    1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y ...

  5. C语言字符串赋值给数组/char *

    字符串(c语言): 以"abcd"为例,解释如下: 1. 申请了空间(在常量区),存放了字符串  2. 在字符串尾加上了'/0'     3. 返回地址 一定记清楚!! 1. 字符 ...

  6. C语言字符数组与字符串的使用及加结束符‘\0‘的问题

    1.字符数组的定义与初始化 字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y ...

  7. 黑马程序员C语言基础(第五天)运算符与表达式、程序流程结构、数组和字符串、函数

    https://www.bilibili.com/video/BV15W411K7k6?p=93&spm_id_from=pageDriver 黑马程序员C语言基础(第五天)运算符与表达式.程 ...

  8. c语言字符数组与字符串的使用详解

    转自http://www.jb51.net/article/37456.htm 1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. char str[10]={ ...

  9. c字符串分割成数组_数组与字符串

    定义数组时,应该注意以下几点: (1) 数组使用的是方括号[ ],不要误写成小括号( ). (2) 常量表达式的值必须是一个正整数值,不能含有变量,但是可以是符号常数或常量表达式. (3) 数组定义后 ...

最新文章

  1. 读过的好书[技术类]
  2. foo、bar到底是什么意思
  3. Win10安装Latex
  4. Linux shell字符串截取与拼接
  5. vld检测不输出_输出轴热处理形变超差,找找原因
  6. ubuntu 改linux密码忘了怎么办,Ubuntu 14.04忘记root密码的解决方法
  7. CVE-2015-1635-HTTP.SYS远程执行代码漏洞(ms15-034)
  8. 实现CA证书创建及客户端申请证书
  9. 推荐一款 ES 集群可视化工具:Cerebro,简单、实用!
  10. 龙将加速浏览器_360安全浏览器正式进军政企市场 积极适配中国芯
  11. 整理了 40 多套 Java 完整实战项目,各个精品!
  12. Mysql-索引优化
  13. 解决视频导入pr中只显示音频
  14. java连接mysql lookup_Java数据库连接池lookup用法
  15. 2017中国北京艺术与框业展览会(AFAEXPO)会刊(参展商名录)
  16. 计算机考研数学和英语难吗,英语难还是数学难
  17. 【区块链108将】数据盾:顶级白客们对于网络安全的美好憧憬
  18. 开源机器人控制软件OROCOS
  19. Tomcat Servlet Request
  20. 压力测试工具ab介绍

热门文章

  1. java获取请求ip的方法
  2. python—生产者消费者模型
  3. css背景视差_具有JavaScript和CSS转换的廉价视差
  4. Linux nginx 项目部署
  5. 国际标准ISO/IEC 30144: 2020在智能变电站辅助监测中的应用研究
  6. Monkey测试教程
  7. 手机cpu什么型号支持鸿蒙系统,华为鸿蒙2.0系统支持的手机型号(图文)
  8. 论 *.pdm 文件的正确打开方式
  9. 巨人java生鲜app下载_Java生鲜电商平台-生鲜电商商品中心系统设计与数据库架构(生鲜小程序/APP)...
  10. exlc表格怎么换行_excel如何换行_表格怎么换行上下换行