黑马程序员--C语言基础之--数组、指针的基础知识

时间:2021-04-15 00:23:48

------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;