1. 数组大小

我相信,在C#/Java中,更多的人愿意用List<T>来取代数组,一方面是List提供了较多的方法,另一方面也无需我们去指定数组的大小。

那么在C语言中,我们既然需要必须指定数组的大小,而一般来讲,很多数组大小事我们无法确定并且经常会发生变化的,那么我们最好的方式就是用宏定义来限定数组的大小。

#define SIZE 10

int main (void){    int a[SIZE];}

如果包含多个数组的话,用宏就很难记忆,那么我们就可以利用sizeof运算符。

int main (void){    int a[]={1,3,4,55,6,7,89,9,0};    int i ;    printf("%d",(int)sizeof(a)/(int)sizeof(a[0]));    for(i=0;i<(int)sizeof(a)/(int)sizeof(a[0]);i++)    {        a[i]=0;    }    for(i=0;i<(int)sizeof(a)/(int)sizeof(a[0]);i++)    {        printf("%d\n",a[i]);    }}

注意,我们之前说过,sizeof返回的值是size_t,因此,我们在计算时,最好将其先强制类型转换为我们可以控制的类型。

2. 数组初始化

一般情况下,我们初始化数组都是把整数数组初始化为0,那么我们一般会怎么做呢?

#define SIZE 5

int main (void){    int a[SIZE]={0,0,0,0,0};}

那么如过SIZE=100怎么办,那么很多人都会这样去做。

#define SIZE 100

int main (void){    int a[SIZE];    int i ;    for(i=0;i<SIZE;i++)    {        a[i]=0;    }}

其实我们完全不用麻烦,这么一句代码就可以搞定了。

#define SIZE 100

int main (void){    int a[SIZE]={0};}

在C99中,提供了一种初始化式,使得我们可以这样来写。

#define SIZE 100

int main (void){    int a[SIZE]={[5]=100,[50]=49};}

而其他的数字就都默认为0。那么我们来考虑这样一段代码:

#define SIZE 10

int main (void){    int a[SIZE]={1,2,3,4,5,[0]=6,7,8};}

那么在C99中,这段代码的结果究竟是什么呢?这个就需要我们来了解一下数组初始化式的原理。

其实,编译器在初始化式数组列表时,都会记录下一个待初始化的元素的位置,比如说在初始化index=0的元素时,会记录下1,这样以此类推,但是当初始化index=5的时候,首先根据他的初始化式记录下一个待初始化的元素时index=1,然后初始化 index=0的元素为6。那么也就是说:最后的结果应该是{6,7,8,4,5,0,0,0,0,0}。

3. 常量数组

当数组加上const就变成了常量数组,常量数组主要有两个好处。

1. 告诉使用者,这个数组是不应该被改变的。

2. 有助于编译器发现错误。

4. C99的变长数组

这是个很爽的东西,我们再也不必担心为数组指定大小而发愁了,指定大了会造成空间的浪费,指定小了又不够用。

在C99中,他的长度会由程序执行时进行计算。

方式如下:

int main (void){    int size;    int a[size];    scanf("%d",&size);}

5. 数组的复制

很多时候,我们需要把一个数组的元素复制到另一个数组上,我们大多数人第一个想到的就是循环复制。

#define SIZE 10

int main (void){    int a[SIZE];    int b[SIZE];    int i ;    for(i=0;i<SIZE;i++)    {        a[i]=i;    }    for(i=0;i<SIZE;i++)    {        b[i]=a[i];    }    for(i=0;i<SIZE;i++)    {        printf("%d",b[i]);    }}

其实还有一种更好的方法是使用memcpy方法,这是一个底层函数,它把内存的字节从一个地方复制到另一个地方,效率更高。

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

#define SIZE 10

int main (void){    int a[SIZE];    int b[SIZE];    int i ;    for(i=0;i<SIZE;i++)    {        a[i]=i;    }    memcpy(b,a,sizeof(a));    for(i=0;i<SIZE;i++)    {        printf("%d",b[i]);    }}

C语言学习笔记(4)相关推荐

  1. 梓益C语言学习笔记之链表&动态内存&文件

    梓益C语言学习笔记之链表&动态内存&文件 一.定义: 链表是一种物理存储上非连续,通过指针链接次序,实现的一种线性存储结构. 二.特点: 链表由一系列节点(链表中每一个元素称为节点)组 ...

  2. 6.方法(go语言学习笔记)

    6.方法(go语言学习笔记) 目录 定义 匿名字段 方法集 表达式 1. 定义 方法是与对象实例绑定的特殊函数. 方法是面向对象编程的基本概念,用于维护和展示对象的自身状态.对象是内敛的,每个实例对象 ...

  3. 梓益C语言学习笔记之指针

    梓益C语言学习笔记之指针 一.32位平台下,地址是32位,所以指针变量占32位,共4个字节 二.内存单元的地址即为指针,存放指针的变量称为指针变量,故:"指针"是指地址,是常量,& ...

  4. c语言中void arrout,c语言学习笔记(数组、函数

    <c语言学习笔记(数组.函数>由会员分享,可在线阅读,更多相关<c语言学习笔记(数组.函数(53页珍藏版)>请在人人文库网上搜索. 1.数组2010-3-29 22:40一维数 ...

  5. c语言float二进制输出代码_C语言学习笔记——学前知识概述

    将我大一学习C语言时做的笔记拿来与大家分享,内容比较浅显,比较适合初学者,如有错误还请见谅,提出改正,谢谢! 前言:此C语言笔记是本人在自学时记录的一些重点或初学者常犯的错误,希望我的这本笔记能够对大 ...

  6. c语言学习笔记【结构体02】结构体指针变量与结构体变量的函数参数,C语言学习笔记结构体02结构体指针变量与结构体变量的函数参数.docx...

    C 语言学习笔记[结构体02]结构体指针变量与结构体变量 的函数参数 C 语言学习笔记之结构体指针变量一提指针,那可 是 C 语言的核心了,有多少学子曾拜倒在指针的脚下.单纯的说指针,其实并不难,但是 ...

  7. C语言学习笔记---001C语言的介绍,编译过程原理,工具等

    C语言学习笔记---001C语言的介绍,编译过程原理,工具等 创梦技术交流平台:资源下载,技术交流,网络赚钱: 交流qq群:1群:248318056 2群:251572072 技术交流平台:cre.i ...

  8. go get 拉取指定版本_go语言学习笔记-基础知识-3

    相关文档 go语言学习笔记-目录 1.简介 1.1 什么是GO Go 是一个开源的编程语言,它能让构造简单.可靠且高效的软件变得容易.Go是从2007年末由Robert Griesemer, Rob ...

  9. 安装成功配置环境变量_go语言学习笔记-Windows10开发环境安装和环境变量配置

    相关文档 go语言学习笔记-目录 1.安装 1.1.访问 https://golang.google.cn/dl/ 或 https://golang.org/dl/ 下载官方安装包 1.2.选择Win ...

  10. C语言学习笔记—code:blocks工具debug调试异常

    C语言学习笔记-code:blocks工具debug调试异常 参考文章: (1)C语言学习笔记-code:blocks工具debug调试异常 (2)https://www.cnblogs.com/do ...

最新文章

  1. SCCM 2016 配置管理系列(Part 12 )
  2. centos7.2安装mysql5.7_Centos7.2下使用YUM快速安装MySQL5.7的方法
  3. Android性能优化——内存泄漏优化
  4. scanf函数详解(下)
  5. Leetcode--560. 和为K的子数组
  6. vue 刷新嵌套路由_vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法...
  7. 在 Windows 上安装Rabbit MQ 指南
  8. 记事本java代码_Java记事本源代码(完整).doc
  9. 浅谈实时语音质量监控系统
  10. 《王阳明心学及其当代意义》观后总结
  11. 使用 Infiniband 实现 RDMA !IB卡介绍!下载IB 驱动 !lspci | grep Mell 查看 IB卡!
  12. abaqus 关联 子程序_Abaqus2016版本关联子程序教程
  13. 不同坐标系下角速度_惯性技术常用坐标系
  14. Python 实现超级玛丽游戏
  15. 模板方法模式--我们一起下饺子
  16. 滚动 下拉简单实现分页
  17. 如何使excel实现汉字转拼音及获取大写拼音并保存为常用函数
  18. 智能船舶概况(国内篇)
  19. ThinkPad物理机安装Linux系统实战企业级项目之CentOS安装
  20. 记录第一次完整安卓逆向过程笔记

热门文章

  1. POI LastRowNum and PhysicalNumberOfRows
  2. Clojure入门教程: Clojure – Functional Programming for the JVM中文版
  3. Robo 3T SQL
  4. SpringCloud学习(八)消息总线(Spring Cloud Bus)(Finchley版本)
  5. python-语言播报
  6. ThreadPoolExecuotor源码参考
  7. setTimeout 的定时器的妙用
  8. hdu 3401(单调队列优化dp)
  9. Js String转Int(Number与parseInt的区别)
  10. Log4net使用简介