iOS笔记:第八篇 C语言 指针

来源:互联网 发布:黑客网络hacknet 攻略 编辑:程序博客网 时间:2024/05/19 04:04

第一节     指 针

1指针与指针变量.

    1). 指针的定义:指针就是变量的地址.

    2). 指针变量用来存储地址的变量.

    3). 指针变量中存储的是另外1个变量的地址.

        int num = 12;

        指针变量 p1 = num变量的地址.

         要操作num变量,通过num变量可以操作通过p1指针变量也可以操作.

    4)指针变量.

       可以通过指针变量找到指针变量指向的变量.

 2指针变量的声明

    1). 首先指针是1个变量.

        普通变量的声明数据类型 变量名;

        指针变量的声明数据类型 *变量名;

        声明注意: * 可以紧跟在类型后面,也可以紧跟在变量名前面.还可以使用空格将其空开.

        int *p1; int* p1; int * p1;

    2).*代表这个变量不再是1个普通变量,而是1个专门用来存储地址的个指针变量.

    3).指针变量是用来存储地址的.个指针变量并不是所有的地址都可以存储而是有限   制的.是由指针的类型来限定的.

       int *p1;

       这个p1指针变量的类型是int类型的这个p1指针变量之中就只能存储  int变量  的地址.

    4).指针变量本质上也是个变量.

        -> 指针变量的命名要遵守标识符的命名规则及规范.

        -> 指针变量也可以批量的声明.

            int *p1,*p2,*p3;

    5). 注意

        int *p1;// 这个指针变量的名字叫做p1 不是*p1

 3指针变量的初始化.

    1). 指针变量是用来存储变量的地址的.

        -> 不能为指针变量直接赋值个数据或者变量.指针变量中只能存储地址

           int *p;

           p = 10; //错误写法

           int n = 10;

           int *p1 = n; //错误写法     

        -> 在使用变量的时候数组名直接拿到数组的地址,其他的变量是拿到变量的值。

    2). 指针变量不是任意的地址都可以存储的,由指针的类型来限定.

        指针变量是什么类型那么这个指针变量就只能存储这个类型的变量的值.

    3). 取变量的地址.

        &取地址运算符.

 

        &变量名这个表达式的结果是这个变量的地址.

        int n= 10;

        &n;

        使用格式控制符 %p 输出地址.

    4). 初始化指针变量的值.

        使用取地址运算符取出变量的地址 然后赋值给指针变量.

        int num = 12;

        int *p;

        p = #

        此时,指针变量p中存储的是num变量的地址p指向了num

    5). 注意

        指针是什么类型的这个指针变量中就只能存储这个类型的变量的地址.

        否则就会发生非常严重的后果

4指针变量的使用.

   1). 指针变量中存储的是另外1个变量的地址.

         int num = 10;

         int *p1 = #

         printf("%p\n",&num);//打印num的地址

         printf("%p\n",p1);//打印p1的地址

         指针变量p1的值 是num的地址.

    2). 通过指针变量可以访问指针变量所指向的变量.

 

       访问变量的方式:

       -> 直接访问 :

             int num = 12;

             num = 10;

       -> 间接访问:

             变量可以被个指针变量所指向通过指针变量访问.

       语法:

         *指针变量;  访问到的是这个指针变量指向的变量.

         int num = 12;

         int *p1 = #

         *p1;

         *p1 访问的是p1这个指针变量所指向的变量。

         此时: *p1 其实就是num

        一定要清楚:

         p1  访问的是指针变量p1的值.

         *p1; 访问的是p1指针变量指向的变量.

   3). 举例:

       int num = 12;

       int *p1 = #

       p1 访问的是p1指针变量. p1的值是num的地址

       *p1 访问的是p1这个指针变量指向的变量p1指针变量指向的是num变量.

       *p1访问的其实就是num变量.

 5指针变量使用注意的细节

    1). NULL.

       个指针变量中应该存储另外个变量的地址如果个指针变量的值赋值为NULL. 代表这个指针变量不指向任何的变量

       int *p1 = NULL;

       int *p1 = 0; //和上面一样代表p1指针变量不指向任何变量.

    2). 初始化指针变量.

        可以将个指针变量的值赋值给另外个指针变量

        前提指针变量的类型要一致.

        多个指针变量可以指向同个变量.

    3). 野指针.

        当声明个指针变量,没有为指针变量赋值这个指针变量中是有值的垃圾值.随机值 这个时候,这个随机的值就有可能指向另外的块内存了.这块内存有可能没有使       用也有可能正在被别的程序使用甚至还有可能被系统在使用.如果这个时候操作这个指针指向的空间,那么就会产生非常严重的后果.像这样的指针叫做野指针操作个           野指针是非常危险的所以,在声明1个指针变量的时候如果不确定这个指针变量指向那个空间一定要为其赋个初始值 NULL 或者是0

 

第二节     指针的分类

 1. 一级指针:

      个指针变量中存储的是个普通变量的地址像这指针就叫做一级指针.

 

  2. 二级指针:

      个指针变量中存储的是级指针变量的地址那么这个指针就叫做二级指针.

  3. 二级指针的声明.

     1). 一级指针使用*来声明.

         二级指针使用两颗*来声明.

     2). 二级指针变量只能存储一级指针的地址

         int num = 12;

         int *p1 = # //这是1个一级指针一级指针存储普通变量的地址.

         int **p2 = &p1; //p21个二级指针,二级指针只能存储一级指针的地址.

   4. 二级指针的使用

         int num = 12;

         int *p1 = #

         int **p2 = &p1;

         *p1 访问num

         *p2 访问p1

         **p2 --> *(*p2)--> *p1 --> num

 

第三节     指针的运算

 1. 指针是可以做加减算术运算的.

  //    int num0 = 1;

//    int num1 = 12;

//    int num2 = 2;

//    int *p = &num2;

//    p +=2;

//    printf("*p = %d\n",*p);

//    p--;

//    printf("*p = %d\n",*p);

  2. 指针的值 + 1

      这个1不是一个字节地址,而是看指针变量是什么类型,以这个类型占的字节数为单位.

      int *p = #

      p = p + 1;  //这个1指的是一个int所占的字节数.

  3. 加减数字 

      并不是加减那么多的字节地址,而是以指针类型为单位这个类型的变量占几个字节,那么就以这个占位.


第四节     指针与一维数组

 1. 一维数组.

      一个一维数组在内存之中是一块连续的字节空间.

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

      从高地址向低地址 连续的分配12个字节空间.

 2. 数组的地址问题.

   1). 数组的地址是 数组的第0个元素的地址 , 也是数组的第0个元素的首字节第地址.

   2). 数组名 就是数组的地址.

   3). 数组名  == 数组的地址 == 数组的第0个元素的地址 ==数组的第0个元素的首字节地址

3. 数组元素指针.

      如果一个指针指向了数组的元素,那么这个指针就叫做元素指针.

4. 作用:

     如果要访问数组的元素可以通过下标来访问,也可以通过指针来间接访问.

5. 更重要的作用

     可以使用指针运算,来遍历数组中的每一个元素.

6. 使用指针操作数组和数组中的元素.

     int arr[3] = {10,20,30};

    a. 1个非常之重要的问题.

       arr这个数组名是一个地址是数组的地址 

       数组的地址 == 0个元素的地址.

    b. 我们可以使用一个指针变量指向数组的元素 。

       int *p1 = &arr[0];

       int *p1 = arr;

    c. 通过指针遍历数组中的所有的元素

         1).第一种遍历方式.

         int arr[3] = {10,20,30};

         int *p1 = arr;

         for(int i = 0; i < 3; i++)

         {

            printf("%d\n",*(p1+i));

         }

         2). 2种遍历方式.

         使用数组名作为指针来遍历.

         int arr[3] = {10,20,30};//arr数组名就是数组的地址.

         for(int i = 0; i < 3; i++)

         {

                printf("%d\n",*(arr+i));

         }

        3). 3种遍历方式.

         int arr[3] = {10,20,30};

         int *p = arr;

         for(int i = 0; i < 3; i++)

         {

            printf("%d\n",*(p++));

         }

         //每循环1,指针p的值是在发生变化的.

        4). 第四种遍历方式  使用下标来遍历.

       d 数组名代表数组的地址, 而数组的地址在数组创建的时候就已经确定。

        所以是不能修改数组名,但是可以用.

7. 当数组作为函数的参数的时候实际上它并不是1个数组, 本质上是1个指针变量.



0 0
原创粉丝点击