黑马程序员--C语言基础之--数组、指针的基础知识
------IOS培训期待与您交流! -------
一、数组:
1、基本概念:数组是相同类型的(有序)数据集合,有序数组的特征是:(1)下标是连续的;(2)存储地址也是连续的
这里要解释一下数组中会出现的几个名词:
(1)数组名:标示符,代表这个数组
(2)数组下标:系统自动分配给数组的一个编号(0开始)
(3)数组的长度:数组存储元素的个数
2、数组的定义
(1)定义的格式:
类型 数组名[常量表达式];
其中,常量表达式可以为:1)数字 2)返回数字的整数 3)变量(C99不支持,但是LLVM支持)
int arrp[10]; //定义一个int类型的数组,长度为10,数组名是arr
注意:
a.数组名不能和变量名同名
b.数组在定义的时候可以和定义其他变量混合定义 int a,b,c[10];
3、数组的初始化和引用方法
(1)初始化的方法:数组初始化的方式有一下两大种:
第一种是在定义的时候进行初始化的操作
1)完全初始化
int a[5]={1,2,3,4,5};
2)部分初始化
int a[5]={1,2,3};
3)指定位置元素的初始化
int a[5]={[2]=4,[4]=2};
4) 定义的同时初始化,但是不指定长度
int a[]={1,2,34,55,67,67}; //系统会根据赋值的内容来确定数组的长度
第二种是先定义数组,然后在进行初始化
int a[5]; //定义一个长度为5的int型数组
//通过下标来初始化,显式的对每一个元素初始化
a[0]=1;
a[1]=100;
a[2]=150;
a[3]=45;
a[4]=200;
访问的方法:对数组的访问是使用数组的下标来进行访问的,因为下标从0开始,访问数组的时候,如一个数组的长度为n ,下标的范围 0-n-1,绝对不能越界访问。
int a[n]; //a[n] 这是错误的,最多能访问到 a[n-1]
越界:就是约错了对象(访问了我们不应该访问的空间),其他语言中约见都会报错,但是现在用的C99的标准,是不报错的。
4、数组的存储原理
(1)数组在内存中是一片连续的内存存储空间,数组名指向数组的首地址
(2)数组中每个元素的地址是连续的
(3)每个元素在存储数据的时候,低位存在低地址字节,高位存在高地址字节
(4)数组名是用来存放数组的首地址的。
简而言之:数组名 == &a[0] == 数组的首地址
如何计算数组的长度呢?这里我们需要用到一个sizeof字符,具体实现: 数组的长度 = sizeof(数组名)/sizeof(数组元素的类型)
5、数组作为函数的参数
1)数组的元素作为函数的参数
数组的每个元素可以用 a[i] 来表示,a[i] 相当于是一个变量,相当于把a[i]值赋值一份,传递给函数的形参,即数组的元素作为函数参数就是值传递。
2)数组名作为函数的参数
数组名作为函数的参数,就不一样了,数组名是一个地址。
函数的形参和我们数组的名称都指向的是同一块内存空间,所以函数中对数组的操作,就等同于直接操作我们的数组。
二、指针
1、指针的基本概念
计算机给我们的内存若干个存储单元,每个单元都有唯一地址,每个单元都可以存储内容,而地址是唯一的,获取地址的方法“&变量名”,地址所对应的存储单元是可变的,
地址就是指针。
2、指针与变量
指针变量:用来存放地址(指针)的这个变量就是指针变量(指针变量只能存放地址)
注意:
(1)指针是一个地址,是常量
(2)指针变量是一个变量(现在可以存放这个地址,下次可以存放其他地址)
格式:数据类型 * 指针变量名
int *p; //定义了一个指向int类型变量的指针变量,变量名p
指针定义完成以后,不过不初始化里面存放的是一个垃圾值,这个时候,我称这个指针为野指针
int i =3,j=6,k; //&i = 2000 k = i+j; int *i_pointer = &i; //存谁的地址,就相当于指向谁 // i_pointer --->i
注意“*”两个使用场合
(1)在定义指针变量的时候使用 int *变量名 表示这个变量是一个指针变量
(2)*指针变量名 表示取得指针变量指向的那片存储单元的内容
关于指针变量的注意事项:
1)什么类型的指针变量,只能指向同种类型的变量
2)指针变量可以是全局,也可以是局部
3、指针变量的初始化方法
1)定义的同时进行初始化
int a=10; int *p = &a;
2)先定义后初始化
int a=10; int *p; int *q; p=&a;
q=&a;
3)如果不确定指针指向什么内容
p = NULL;