A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© hugin 中级黑马   /  2016-9-23 08:41  /  1234 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

"数组作为函数参数
"指针
"指针数组

//------------------数组的基本概念及分类
# 是什么:
用来存储一组数据的容器.

详细分析:

把具有
相同类型
的若干变量
有序
的形式组织起来。这些按序排列的
同类数据元素
的集合称为
数组

float arr[3];  ---->
1.这是个数组  2.这个数组里面的元素必须是float类型  3.里面只能存放3个元素

## 构造类型:
在C语言中,数组属于构造数据类型。
一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。


//-----------------------  一维数组 --> 简称 --> 数组
什么叫一维数组: 这个数组里面存放的不是数组,我们就称这个数组为一维数组

int arr[5] = {1,2,3,4};

int arr[3];   //一维数组

这个数组里面可以存放3个(int)元素,这个三个都必须是int类型的元素

int arr[数组的长度--->数组元素的个数;


//-------------------数组的定义

格式:
类型说明符 数组名[数组长度];

char arr[10];
------>   是什么: 数组   数组名: arr  数组的元素个数 :  10   元素类型 : char

注意点
1) "数组的类型实际上是指数组元素的取值类型"。对于同一个数组,其所有元素的数据类型都是相
同的。第一个数组元素的地址是数组所占内存块的首地址

int arr[5];  //  定义了一个数组   这个数元素个数是  5  从arr[0]....arr[4]


//数组的赋值
arr[0] = 1;
arr[1] = 2;
.....
        
2) 数组名的书写规则应符合标识符的书写规定。 命名规则:
/*
1、只能由字母、数字、下划线组成
2、不能数字开头
3、不能与关键字重名
4、严格区分大小写
命名规范:
1、起一个有意义名字
2、驼峰标示
*/
        
3) 数组名不能与其它变量名相同。
        
4) 方括号中常量表达式表示数组元素的个数,如int a[5]表示数组a有5个元素。但是其下标从0开始计算。a[0]  a[1] ....  a[4]


int arr[10];
arr[0]  --->   "数组的下标"
arr[1]
arr[2]
arr[3]
arr[4]


"我定义长度为5   数组的下标   0----n-1"
        
5) xcode的编译器特性

c99   不允许变量作为数组的长度  ,  在xocde下可以

int num = 10;
int arr[num];   //  注意!

1.  正确:
int num  = 10;

int arr[num];
----------------
2.错误的:
int num = 10;

int arr[num] = {1,2,3,4,5,6,7,8,9,10};  //错误的

"总结一句话: 定义数组必须要确定长度"

int arr[] = {1,2,3};   //  数组元素的个数  3  arr[0]  arr[1]  arr[2]


//---------------------数组的初始化
1."定义的同时,直接初始化:"
类型说明符 数组名[常量表达式] = { 值, 值......值 };

int arr[5] = {1,2,3,4,5};   //  直接初始化

其中在{ }中的各数据值即为各元素的值,各值之间用逗号间隔。


2."先定义后初始化(赋值):"
类型说明符 数组名[常量表达式];

int arr[5];   //定义

arr = {1,2,3};

arr[0] = 1;   //赋值
arr[2] = 2;
.....
arr[4] = 5;   //  初始化


思考: 未初始化的数组元素的值是多少呢?

垃圾数

//--------------------数组的引用  数组名[下标]
数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。


int arr[10] = {1,2,3,4,5,6,7,8,9,10};

数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。

正序输出
for (int i=0; i<10; i++) {
   
    printf("%d\t",a);
}

逆序输出
for (int j=9; j>=0; j--) {
   
    printf("%d\t",a[j]);
}

越界总结:
一个长度为n的数组,最大下标为n-1, 下标范围:0~n-1
1、如果越界了就相当于(访问自己不该访问存储空间)

//-----------------------数组的注意事项

1. 定义数组必须确定的长度
int arr[];   //错误的
int arr[5];  //正确        数组长度为5
int arr[] = {1,2,3,4,5}; //正确   数组长度为5
结论:"定义数组一定会确定数组长度"


2.使用整型变量作为数组长度
int count = 5;
int arr[count] = {1,2,3,4,5};   //错误的

int arr[count];  //正确的
arr[0] = 1;
arr[1] = 1;
...
结论:"使用变量作为数组长度表示,只能定义数组,不能立马对数组进行初始化"


3.关于数组初始化注意事项
1.完全初始化
int nums[5] = {1,2,3,4,5};


2.局部初始化
int arr[100] = {1,2};      //系统会自动将其初始化为0

arr[0] = 1
arr[1] = 2
arr[2] = 0
arr[3] = 0

3.个别初始化


4.数组越界问题
int arr[n];  下标:   0 ---  n-1

arr[3] = 5;  //错误   越界   数组下标使用从0开始

以下正确
arr[0] = 5;
arr[1] = 2;
arr[2] = 3;

结论:数组下标从0开始算,最大下标为(数组元素个数-1)


//---------------------数组的存储方式

数组首地址概念   ---->   arr(数组名)  代表的就是数组首地址

int arr[3] = {1,2,3};


//----------------------------  数组长度 ---->  数组元素的个数
数组长度  =  sizeof(数组名) / sizeof(类型)

sizeof(数组名) ------> 整个数组占的总字节数

sizeof(类型)  ----->  整个数组中一个元素占的字节数

数组的长度 = 数组占用的总字节数 / 数组元素占用的字节数


//-----------------------数组作为函数参数

数组用作函数参数有两种形式:

一种是把数组元素(下标变量)作为实参使用;

一种是把数组名作为函数的形参和实参

-------------------------------------------------------------------

数组元素   作函数实参,就是把    数组元素的值    传送给形参      //值传递

数组名     作为函数参数       是把数组的地址    传递给形参数    //地址传递

-------------------------------------------------------------------

注意:用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组


注意点
1形参数组和实参数组的类型必须一致,否则将引起错误。

2形参数组和实参数组的长度可以不相同 (但是容易出现问题) // 不要这么写

3在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数。


1 个回复

倒序浏览
66666666666666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马