1. 一维数组的创建和初始化

数组是一组相同类型元素的集合。
数组的创建方式:
数组创建的实例:
type_t arr_name [const_n];
//type_t 是指数组的元素类型
//const_n 是一个常量表达式,用来指定数组的大小

//代码1
int arr1[10];
//代码2
int count = 10;
int arr2[count];//数组时候可以正常创建?
//代码3
char arr3[10];
float arr4[1];
double arr5[20];

注:数组创建,在C99标准之前, [] 中要给一个常量才可以,不能使用变量。在C99标准支持了变长数组的概念。

2.数组的初始化

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)。
看代码:

int arr1[10] = {1,2,3};
int arr2[] = {1,2,3,4};
int arr3[5] = {1,2,3,4,5};
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";

数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。

3.一维数组的使用

对于数组的使用我们之前介绍了一个操作符: [] ,下标引用操作符。它其实就数组访问的操作符。
我们来看代码:

#include <stdio.h>
int main()
{int arr[10] = {0};//数组的不完全初始化//计算数组的元素个数int sz = sizeof(arr)/sizeof(arr[0]);//对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:int i = 0;//做下标for(i=0; i<10; i++)//这里写10,好不好?{arr[i] = i;}//输出数组的内容for(i=0; i<10; ++i){printf("%d ", arr[i]);}return 0;
}

总结:
1. 数组是使用下标来访问的,下标是从0开始。
2. 数组的大小可以通过计算得到。

3.二维数组的创建和初始化

.1 二维数组的创建
int arr[3][4];
char arr[3][5];
double arr[2][4];

.2 二维数组的初始化
int arr[3][4] = {1,2,3,4};
int arr[3][4] = {{1,2},{4,5}};
int arr[][4] = {{2,3},{4,5}};//二维数组如果有初始化,行可以省略,列不能省略
二维数组的使用
二维数组的使用也是通过下标的方式。
看代码:

#include <stdio.h>
int main()
{int arr[3][4] = {0};int i = 0;for(i=0; i<3; i++){int j = 0;for(j=0; j<4; j++){arr[i][j] = i*4+j;}}for(i=0; i<3; i++){int j = 0;for(j=0; j<4; j++){printf("%d ", arr[i][j]);}}return 0;
}

4. 数组越界

数组的下标是有范围限制的。
数组的下规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。
C语言本身是不做数组下标的越界检查,编译器也不一定报错,但是编译器不报错,并不意味着程序就是正确的。

#include <stdio.h>
int main()
{int arr[10] = {1,2,3,4,5,6,7,8,9,10};int i = 0;for(i=0; i<=10; i++){printf("%d\n", arr[i]);//当i等于10的时候,越界访问了}return 0;
}

5.数组作为函数参数
往往我们在写代码的时候,会将数组作为参数传个函数,比如:我要实现一个冒泡排序(这里要讲算法思想)函数将一个整形数组排序。
冒泡排序函数的错误设计

//方法1:
#include <stdio.h>
void bubble_sort(int arr[])
{int sz = sizeof(arr)/sizeof(arr[0]);//这样对吗?int i = 0;for(i=0; i<sz-1; i++){int j = 0;for(j=0; j<sz-i-1; j++){if(arr[j] > arr[j+1]){int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}}
}
int main()
{int arr[] = {3,1,7,5,8,9,0,2,4,6};bubble_sort(arr);//是否可以正常排序?for(i=0; i<sizeof(arr)/sizeof(arr[0]); i++){printf("%d ", arr[i]);}return 0;
}

方法1,出问题,那我们找一下问题,调试之后可以看到 bubble_sort 函数内部的 sz ,是1。
难道数组作为函数参数的时候,不是把整个数组的传递过去?
数组名是什么?

#include <stdio.h>
int main()
{int arr[10] = {1,2,3,4,5};printf("%p\n", arr);printf("%p\n", &arr[0]);printf("%d\n", *arr);//输出结果return 0;
}

结论:

数组名是数组首元素的地址。(有两个例外)
如果数组名是首元素地址,那么:

int arr[10] = {0};
printf("%d\n", sizeof(arr));

为什么输出的结果是:40?
补充:
1. sizeof(数组名),计算整个数组的大小,sizeof内部单独放一个数组名,数组名表示整个数
组。
2. &数组名,取出的是数组的地址。&数组名,数组名表示整个数组。
除此1,2两种情况之外,所有的数组名都表示数组首元素的地址。
冒泡排序函数的正确设计
当数组传参的时候,实际上只是把数组的首元素的地址传递过去了。
所以即使在函数参数部分写成数组的形式: int arr[] 表示的依然是一个指针: int *arr 。
那么,函数内部的 sizeof(arr) 结果是4。
如果 方法1 错了,该怎么设计?

//方法2
void bubble_sort(int arr[], int sz)//参数接收数组元素个数
{int sz = sizeof(arr)/sizeof(arr[0]);//这样对吗?int i = 0;for(i=0; i<sz-1; i++){int j = 0;for(j=0; j<sz-i-1; j++){if(arr[j] > arr[j+1]){int tmp = arr[j];arr[j] = arr[j+1];arr[j+1] = tmp;}}}
}
int main()
{int arr[] = {3,1,7,5,8,9,0,2,4,6};int sz = sizeof(arr)/sizeof(arr[0]);bubble_sort(arr, sz);//是否可以正常排序?for(i=0; i<sz; i++){printf("%d ", arr[i]);}return 0;
}

数组的创建和初始化(C语言)相关推荐

  1. C语言数组讲解(1)一维数组的创建和初始化。

    目录 一维数组的创建和初始化. 1.1 数组的创建 1.2数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 1.5数组名的意义 1.1数组的创建 数组的定义:在C语言中有各种数据类 ...

  2. 【C语言数组】数组的创建和初始化 内存中的存储 冒泡排序 sizeof 数组名

    test 一.一维数组的创建和初始化 1.数组的创建 2.数组初始化 2.1.不完全初始化 2.2.不初始化 3.一维数组的使用 3.1.用下标打印1-10 3.2.sizeof 计算数组的元素个数 ...

  3. Julia程序设计3 数组1 创建、初始化、属性与访问

    Julia程序设计3 数组 创建数组 数组的属性 访问数组中的元素 创建数组 1.按列创建数组:如果用中括号创建数组.元素之间用逗号隔开,创建出来的数组就是列向量的形式:用中括号也可以按列创建多维数组 ...

  4. 《数组》包括一维数组二维数组的创建和初始化,在内存中的存储和使用方法,数组越界和作为函数参数的情况

  5. Java数组 (一) 创建数组及数组的简单使用

    引言: 我们之前创建两个整型变量可以用 int a = 10;int b = 20; 创建4个整型变量,也可以一行行定义变量, 假设我现在要一次性创建 1w 个整型变量,这种时候我们就需要用到数组这个 ...

  6. golang 初始化并赋值_Go语言创建、初始化数组的常见方式汇总

    本文实例总结了Go语言创建.初始化数组的常见方式.分享给大家供大家参考.具体分析如下: Go语言的语法很灵活,以下展示了创建并初始化数组的多种方式: //数组初始化的各种方式 func arraySl ...

  7. C语言数组的创建初始化以及使用

    #include<stdio.h>int main() {int array[10];//创建char ch[10];int n = 10;int arr1[n] = {0};//err ...

  8. Golang——结构体创建与初始化、结构体与数组、结构体与切片、结构体与map、结构体作为函数参数、结构体方法、结构体方法继承

    结构体: 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合 结构体可以很好的管理一批有联系的数据,使用结构体可以提高程序的易读性,类似于Java的类一样 不能在结构体直接赋值 字段名必须唯一 ...

  9. C语言之:数组的定义和初始化必备练习题

    1. 作业标题(688) 关于一维数组初始化,下面哪个定义是错误的?( ) 作业内容 A.int arr[10] = {1,2,3,4,5,6}; B.int arr[] = {1,2,3,4,5,6 ...

最新文章

  1. iar定义arm版本_IAR Systems发布 IAR Embedded Workbench for ARM新版本
  2. android将拦截短信通过邮箱发送,网易邮箱Android客户端推出 加速布局移动互联网...
  3. 动态链接(指向运行时常量池的方法引用)
  4. linux ll 转数组,List、Set、数组之间的转换
  5. VisualSvn Server安装和使用
  6. 超越苹果! 雷军愿望达成:小米,世界第三!
  7. rabbitmq消息保证幂等的消息设计
  8. java中数组的返回值是什么类型_java基础学习:数组的常用操作与基础二维数组用法、及基本数据类型和引用数据类型赋值的区别...
  9. 国际化的locale类详解
  10. python_turtle库丘比特之箭
  11. mysql诸如漏洞攻击_MySQL及漏洞笔记
  12. 软件测试---前言篇
  13. Allegro_理解通孔焊盘
  14. 分析IBinder体系中getService的流程
  15. Linux搭建web服务器---静态网站
  16. dubbo下Dubbo协议注册中心理解SimpleRegistryService之register,getRegistered,notify方法理解注释
  17. java 中的多种判空方式
  18. C语言,实现通讯录功能
  19. 【signal】傅里叶分析和FFT蝶形算法
  20. python 因子分析 权重计算方法_【万矿新品】因子研究利器——WindAlpha

热门文章

  1. 二战总结(信息与通信工程)
  2. 设置chrome浏览器的开发调试工具主题为dark模式
  3. 毕业后成为大厂职业游戏建模师?门槛高不高,一看就知道
  4. 网络营销技巧:有必要为移动端专门做站吗?
  5. IntelliJ IDEA设置显示内存指示器的几种方法
  6. jquery.tipsy实现标题提示功能
  7. 天然气泄漏报警器工作原理是什么
  8. 保弘实业|关于人生理财必知的六个等式
  9. 网站登录密码忘记后,通过向手机发送验证码实现找回密码的实现方法
  10. 数学建模c语言必背知识,【计算机网络论文】数学建模计算机知识的应用(共4296字)...