黑马程序员—IOS基础之C语言—数组与指针

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——

                                    第一章 数组

一、一维数组
1、一维数组的定义

 (1)数组:相同类型的若干个数组组成一个有序的集合
 (2)一维数组:
  数组的每个元素都是基本数据类型的变量
  数组的每个元素都不是一个数组
 (3)一维数组的定义
  数组类型  数组名[数组长度]
 (4)一维数组的定义的注意事项: 
#include 
#define M 4
int main(int argc, const char * argv[]) {   
    //注意事项
    //(1)数组的长度是可以是一个常量 也可以是常量表达式
    int b1[1+1];  //3+3是常量表达式
    //(2)数组名的命名规则:严格按照标识符的命名规范
    //(3)数组名不能和其他变量同名
    int b2;  //这是一个整型变量
    int b2[4];//定义了一个整型数组,和整型变量同名了
    //(4)数组的长度不可以为一个变量
    int len =4;
    int b3[len];  //这是我们xcode编译器做的优化放到c++编译器就报错
    //(5)数组的长度可以使用 宏定义
    int b4[M];    //M是一个宏定义

    //(6)定义数组的时候,还可以定义普通变量
    int m,n,b5[4];  //定义两个整形变量 m,n,又定义了一个长度为4 数组名为a7的数组
    return 0;
}

2、一维数组的初始化
初始化就是给定义的变量赋值。
初始化的方法

   // 1)定义的同时进行初始化
   //   格式:
   //   数据类型 数组名[长度]={值1,值2,...};
   //   (1)定义的同时完全初始化
        //定义了一个长度为3的数组,数组名是b,给数组的每一个元素进行赋值
        int b[3]={1,2,3};
        //定义个一个数组,数组名是b1,数组的长度根据后面大括号中赋值的个数来决定的(此处大括号中有3个值,所以数组长度是3)
        int b1[]={233,45,6};
        (2)定义的同时进行部分初始化
         //定义了一个长度为3的数组,数组名是b2,给数组的元素进行赋值
        //第一种方法
        int b2[3]={6,8};   
        //第二种方法:定义一个长度为10的数组,数组名是b3,
        //[4] 表示下标为4的元素赋初值1
        //[6] 表示下标为6的元素赋初值2
        int b3[8]={[4]=1,[6]=2};
   // 2)先定义数组,然后在初始化
        int b4[4];  //定义了一个数组
        //通过下标法进行初始化,数组长度是4
        //下标是数组的元素的编号
        // 0  1  2  3
        //依次赋值
        a4[0] = 1;  
        a4[1] = 3;  
        a4[2] = 5;
        a4[3] = 7;

3、一维数组的一些问题

一维数组的初始值的问题:
(1)若未进行初始化,那么一维数组中存放的是垃圾值
(2)若只进行了部分初始化,那么其他数组元素的值为0
(3)使用先定义后初始化的方式,如果部分数组元素被初始化了,系统不会对没有初始化的那部分元素进行赋值0的操作

一维数组的访问:
数组的引用(访问):数组名[下标] 就可以访问数组的元素

数组的地址问题:
数组名是一个常量 存储的就是数组的首地址,数组名代表了数组的首地址也是数组的第一个元素的地址

一维数组长度计算:
运用sizeof函数计算

二、二维数组
1、二位数组的定义

   二维数组:
   可以看做是一个特殊的一维数组 ,这个一维数组的每个元素又是一个一维数组
   二维数组的定义
   数据类型   数组名[第一维的长度(行)][第二维的长度(列)];
   int a[2][3];
   理解方法:
   1)这是一个特殊的一维数组,一维数组有两个元素 a[0] a[1]
      a[0]  它又存放了一个长度为3的一维数组
   2)定义了一个2行3列的一个矩阵
#include 
#define M 3
int main(int argc, const char * argv[]) {  
    //定义一个二维数组
    int a[2][3];
    //注意事项数组名不能和变量名同名
    int b; 
    int b[2][3]; 
    //数组的长度可以是常量表达式
    int c[2][1+3];
    //注意这种写法,其他的编译器可能不支持,xcode特有的
    int m=3,n =3;
    int arr[m][n];  
    //数组长度可以使用宏定义
    int arr2[3+M][2];  
    return 0;
}    

2、二维数组的初始化

    //二维数组的初始化
    //1)定义的同时初始化  
    //(1)完全初始化
            int a1[2]={1,2};
        //1、特殊的一维数组,第一维有2个元素
            int a[2][3]={{12,23,45},{1,2,3}};  //分段
        //2、连续赋值
            int a[2][3]={1,2,3,4,5,6};
        //3、可以省略第一维
        //int a[3][3]
            int a[][3]={{1,2,3},{3,4,5},{3,4,5}}; 
        //int a[4][2]
            int a[][2]={1,2,3,4,5,6,7,8}; 
    //(2)部分初始化
        //一般情况下我们用于给数组初始化为0
             int a[3][4]={1};
             int a[3][4]={{1},{2},{3}};
        //注意:这种写法第一维长度可以省略
             int a[3][4]={1,2,3,4,5};
   //2)先定义,后初始化
         int a[3][4];
        //第一维下标:0 1 2
        //第二维下标:0 1 2 3
        a[0][0] = 1;

3、二维数组中的一些问题

二维数组的遍历
二维数组的遍历通过数组下标来访问。
二维数组的存储细节
int a[3][3]
数组的首地址 = 数组名a = &a[0] = &a[0][0]
                        第二章 指针

一、基本指针
1、指针变量的定义

(1)指针变量
 用来存放地址的变量,就是指针变量

(2)指针的实质
 就是地址

(3)指针变量的定义
 数据类型  *指针变量名;
 //定义了一个指针变量,变量名是p
 //int表示,p只能存放一个int类型的变量的地址
     int *p;   
 //定义了一个指针变量,变量名是p1
 //p1只能存放一个char类型数变量的地址
  char *p1; 
  //警告,这是不对的
  int num=10;

(4)指针变量定义的注意事项
  1)“*”  必须得有,如果没有就相当于定义一个普通变量
  2)指针变量能用来存放数值或者字符之类的吗? 不能
  3)指针变量,归根结底还是变量,也有全局和局部变量之分

2、指针变量的初始化和引用

(1)指针变量也是变量
指针变量的使用: 定义指针变量  ----> 初始化指针变量 ---> 使用(使用指针变量间接的存取内存单元的值)。

(2)指针变量如果不初始化会有什么后果?
结论:如果一个指针变量定义以后,如果不进行初始化,这个指针变量存放的事一个垃圾数,这个指针变量,称之为野指针。
一定要避免操作野指针,因为可能会带来意向不到的错误值是一垃圾值,有可能存放是系统程序的地址,可能会造成系统崩溃。

(3)"*" 的两种用法
 1) 用于定义一个指针变量
 2) 存储指针变量指向的存储空间的内容
    //指针变量如何进行初始化,指针变量应该用地址初始化
    //1、定义的同时进行初始化
    //   1)完全初始化
        //用a的地址初始化 p这个指针变量
        //另外一种描述方法:p指向了a
           int *p = &a; 
           //p1 p2都指向了a 
           int *p1 = &a,*p2 = &a; 
    //    2)部分初始化
        //定义了两个指针变量 p3 p4
           int *p3 = &b,*p4;  
           p4 = &b;
    //2)先定义后初始化
        int *p7;
        //空指针
        p7 = NULL;  
    //3)如果定义了一个指针变量,但是我不知道让这个指针指向谁
    //NULL 是空(0)
    int *p5 = NULL;  
    //空
    int *p6 = 0;     

指针的一些问题

   指针的应用场景:
   1)在被函数中可以修改主调函数中的变量的值
   2)让函数可以有多个返回值

   二级指针:
   指针存放的是另外一个指针的地址,一般形式,**p。

   指针为什么要区分类型
   因为指针存放的是地址,每一种数据类型的占用的内存字节数都不一样,所以要区分类型。

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——

你可能感兴趣的:(ios开发)