本节主要介绍数组。

一、数组

/*
数组:一个变量可以存n个变量。
语法:类型 数组名[长度(正整数)];
例如:int score[5];//定义了一个int类型的数组,长度为5,可以保存5个数据。
char score[5];//定义了一个char 类型的数组,长度为5,可以保存5个数据。
访问数组中的元素:
取值:数组名[编号];
赋值: 数组名[编号] = 值; 元素:数组中实际存放的一个个数据。
下标/索引:系统自动分配的编号,从0开始。
长度:数组实际保存元素的个数。
*/
//例如:
int main(int argc,const char * argv[]){
int scores[];//可以保存10个数据。
//循环为scores赋值。
for(int i= ;i<;i++){
scores[i] = i;
}
//循环打印scores的元素。
for(int i= ;i<;i++){
printf("第%d个元素的值为:%d \n",i+,i);
}
}
/*
数组的赋值:
1、先声明,后赋值。
类型 数组名[长度];
数组名[下标] = 值;
2、在声明的时候初始化。
1)、类型 数组名[长度] = {数据1,数据2,数据3,数据4,.......};
例如:char charTest[3] = {'a','b','c'};
2)、类型 数组名[] = {数据1,数据2,数据3,数据4,.......};
例如:char charTest[] = {'a','b','c'};
//第二种方式的长度,编译器会根据元素的个数来确定。
3)、类型 数组名[5] = {数据1,数据2};//给的数据小于指定的长度
例如:char charTest[5] = {'a','b','c'};
4)、类型 数组名[5] = {[下标]=数据1,[下标]=数据2,};//给的数据小于指定的长度
例如:char charTest[5] = {[3] = 'a',[1] = 'b',[0] = 'c'}; 遍历数组:
用循环依次访问数组中的每一个元素。 数组的越界:
定义:访问不属于数组本身空间的元素,运行时会报错,也可能是未知的异常。
数组最大访问的下标:长度-1。 计算数组的长度:
sizeof(数组名);:得到这个数组占用内存的总长度。
数组的长度 = sizeof(数组名) / sizeof(类型);
注意:
1、数组和数组变量之间,不能赋值。
例如:int nums1[5] = {1,2,3,4,5};
int nums2[5] = nums1;
2、数组名声明后也不能直接赋值。
例如:int nums1[5] ;
nums1 = {1,2,3,4,5};
原因:数组名是一个地址常量。
*/
/*
数组作为函数的参数:
语法:返回值类型 函数名(类型 数组名[]){ 函数体; }
注意:参数中数组的长度可不写,写了也没用,规范的写法时不写。 下面看一组代码
*/
void test1(int nums[]){
nums[]=;
nums[]=;
nums[]=;
}
int main(int argc,const char * argv[]){
int nums[] = {,,};
test();
for(int i = ;i<;i++){
//注意:这里输出的不是1,2,3,而是11,22,33。
printf("%d \n",nums[i]);
}
return ;
}
/*
上面的代码涉及到另外一个概念:引用传递。
概念:传递的是地址,相当于把该变量的内存地址共享给函数。
特点:在函数内部改变了形参的值,外面的实参也会发生变化。
说明:基本数据类型(int,char,long,double,float,short)不是引用传递;
数组是引用传递。
注意:1、在函数中,不能直接计算形参(数组)的长度,永远等于2。解决办法就是在多传递一个参数,作为数组的长度。
2、函数的数组形参可以不写长度,但是区分类型。
*/

二、冒泡排序

/*
冒泡排序是一种排序算法。
冒泡排序算法的运作如下:(从后往前)
1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。
2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
3、针对所有的元素重复以上的步骤,除了最后一个。
4、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
代码如下:
*/
int main(int argc,const char * argv[]){
//首先定义个数组
int nums[] = {,,,,};
int len = sizeof(nums)/sizeof(int);//得到数组的长度
for(int i = ;i < len - ;i++ ){ //得到循环的次数
for(int j = j<len-i-;j++){ //得到每次需要比较的次数
if(nums[j]>nums[j+]){
int num = nums[j];//保存j元素的值
nums[j] = nums[j+];//交换元素的位置
nums[j+] = num ;//把j往后移
}
}
}
return ;
}

三、二维数组

/*
二维数组:一个数组里面的元素又是一个数组。
语法: 类型 数组名[常量表达式1][常量表达式2];
例如:int nums[3][5];
说明:常量表达式1可以理解为行数,常量表达式2可以理解为列数。上述代码可以理解为一个3行5列的数组,数组名为nums,其下标变量的类型为整型。该数组的下标变量共有3×5个,相当于一个拥有3行5列的平面。
所以:类型 数组名[行数][列数]; 二维数组的初始化:
1、先声明,后赋值。
例如:
int nums[3][5];
nums[0][0] = 1;
nums[0][1] = 2;
nums[0][2] = 3;
nums[0][3] = 4;
nums[0][4] = 5;//以此类推
取值:nums[0][4] = 5
2、声明的时候初始化。
1)、例如:int nums[3][5] = {{1,2,3,4,5},{1,2,3,4,5},{1,2,3,4,5}};
语法:类型 数组名[行][列] = {{元素列表},{元素列表},{元素列表}};
取值:nums[0][4] = 5
2)、例如:int nums[3][5] = {1,2,3,4,5,1,2,3,4,5,1,2,3,4,5};//这样会根据列数自动分行,等价于前一种方式。
语法:类型 数组名[行][列] = {元素列表};
取值:nums[0][4] = 5
3)、例如:int nums[][3] = {1,2,3,4,5,6}//省略行数,会根据列数自动检测分为几行
语法:类型 数组名称[][列数] = {元素列表};
取值:nums[0][2] = 3 注意:行可以省略,但是列绝对不可以省略。
*/
//例如:
int nums[][]={,,,};//这也是2行3列,按列数分行,不足的以0补齐。

上面介绍了二维数组初始化的一些知识点,下面介绍二维数组的遍历、行和列的计算。

/*
二维数组相当于一个平面,所以需要用两个循环来控制。外层循环控制行数,内层循环控制行数。
例如:
int nums[2][3] = {1,2,3,4,5,6};
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
printf("%d \n",nums[i][j]);
}
}
输出:1 2 3 4 5 6
二维数组计算列数:
每行的总长度 / 元素占用的字节数
sizeof(数组名[0])/sizeof(类型);
例如:int nums[3][4];
sizeof(nums[0])/sizeof(int);//得到4
计算行数:
二维数组的总产度 / 每行的长度
sizeof(二维数组名) / sizeof(二维数组名[0])
例如:int nums[3][4];
sizeof(nums)/sizeof(nums[0]);//得到3
*/

c语言学习之基础知识点介绍(十):数组的更多相关文章

  1. c语言学习之基础知识点介绍(三):scanf函数

    本节继续介绍c语言的基础知识点. scanf函数:用来接收用户输入的数据. 语法:scanf("格式化控制符",地址列表); 取地址要用到取地址符:&(shift+7) 例 ...

  2. c语言学习之基础知识点介绍(二):格式化控制符和变量的补充

    上节简单介绍了c语言中的一些基础知识点,本节将对之前介绍的不够详细的知识点进行补充. 格式化控制符的消息介绍: %d的其他控制符: 1.%md:m代表这个整数位占用多少位,m是一个整数.实际数字不足的 ...

  3. c语言学习之基础知识点介绍(十四):指针的进阶

    一.指针的加.减法运算 /* 1.加法运算 1).可以跟整数进行加法运算,得到的还是一个地址 公式: 地址 + 1 = 地址 + 1 * 类型所占的字节数 地址 + n = 地址 + n * 类型所占 ...

  4. c语言学习之基础知识点介绍(二十):预处理指令

    一.预处理指令的介绍 预处理命令:在编译之前触发的一系列操作(命令)就叫预处理命令. 特点:以#开头,不要加分号. #include: 文件包含指令 把指定文件的内容复制到相应的位置 #define: ...

  5. c语言学习之基础知识点介绍(十五):函数的指针

    一.函数的指针的介绍 /* 函数指针: 函数的指针,本质上一个指针 指向函数的指针,就是一个函数指针. 回忆:我们写的源代码编译成二进制的指令集,一串交给CPU执行的指令 先存在内存里面,然后CPU读 ...

  6. c语言学习之基础知识点介绍(十二):结构体的介绍

    一.结构体的介绍 /* 语法: struct 结构体名{ 成员列表; }; 切记切记有分号! 说明:成员列表就是指你要保存哪些类型的数据. 注意:上面的语法只是定义一个新的类型,而这个类型叫做结构体类 ...

  7. c语言学习之基础知识点介绍(十):内存空间模型、地址解释及指针变量

    一.内存 /* 内存: 存在内存里的. 内存分了N多个小空间,每个小空间1个字节 每个小空间有它自己的地址.每个地址之间差1 int类型占用4个字节,等于占了4个空间(有4个地址),不需要记住4个地址 ...

  8. c语言学习之基础知识点介绍(十九):内存操作函数

    一.malloc函数 /* 首先需要导入头文件 #include <stdlib.h> malloc void* malloc(n); n是字节大小 开辟堆空间,开辟的字节数以n为准 返回 ...

  9. c语言学习之基础知识点介绍(十八):几个修饰关键字和内存分区

    一.几个修饰关键字 全局变量: 全局变量跟函数一样也分为声明和实现.如果是全局变量,实现在它调用之后,那么需要在调用之前进行声明.注意:全局变量的声明只能写在函数外,写在函数就不是全局变量了而是局部变 ...

随机推荐

  1. oracle报错ORA-01507

    SHUTDOWN IMMEDIATE; STARTUP NOMOUNT; CONTROL1.CTL文件复制到CONTROL2.CTL; ALTER SYSTEM SET CONTROL_FILES=' ...

  2. 使用表达式避免拼接SQL语句

    在SQL语句编写过程中,无论在存储过程中还是在程序中,有时为了使语句兼容全部情况与某字段的特殊情况,不得不拼接SQL字串 如下表 商品ID 类别ID 1 1 2 1 3 2 4 3 5 3 如果我们要 ...

  3. java JdbcTemplate源码

    package com.wl.filter; package org.javaresearch.jerch; import java.lang.reflect.Method; import java. ...

  4. JavaScript---网络编程(6)-Dom和Bom模型概念讲解(节点获取,window对象)

    本节讲Dom和Bom模型概念讲解(节点获取,window对象). out.js: 写了2个输出到页面的函数. function println(param){ document.write(param ...

  5. Java设计模式之装饰模式趣谈

    本文由码农网 – 鲁阿皓原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! 前情提要:http://blog.csdn.net/baidu_30889437/article/details/ ...

  6. yii中上传图片及文件

    Yii 提供了 CUploadedFile 来上传文件,比如图片,或者文档. 官方关于这个类的介绍 : http://www.yiichina.com/api/CUploadedFile CUploa ...

  7. Java学习——数据类型【2】

    1. 对象与类 对象:类的一个实例,有状态和行为. 类:一个模板,描述一类对象的行状态和行为. 2. 类可以包含的变量 类型 局部变量 成员变量 类变量(静态变量) 定义位置 方法.或语句块中 类中, ...

  8. iOS UILabel:宽度固定,自动高度显示全部文字

    desclabel.width = self.view.width - (leftOffset*2); desclabel.lineBreakMode = NSLineBreakByWordWrapp ...

  9. Spring-接口调用

    在Spring框架下实现和调用接口时,不用再代码中创建接口对象.而是依赖容器注入接口的实现对象. 1.创建接口 package service; /** * Created by xumao on 2 ...

  10. 2014年到期的myeclipse5.5.1注冊码

    假设点击Myeclipse的载入项目到server的图标没有反应,这就是MyEclipse过期了,下面是还能用一年的注冊码: subscriber: axin  Serial:nLR8ZC-85557 ...