zoukankan      html  css  js  c++  java
  • C语言——指针

     

    一、 指针的定义、赋值

            1、定义格式:变量类型 *变量名;

                    char   *p(定义了一个指针变量p,且指针p只能指向char类型数据)

            2、指针的特点,指针变量只能存储地址

            3、指针的作用:能够根据一个地址值,访问对应的存储空间

            4、指针的存储:任何指针都占8个字节的存储空间

            5、指针的赋值: 

                  ①  先定义后赋值

                   1 int a = 10; 2 int *p; 3 p = &a; 

                  ②  定义的同时赋值             

                     1 int a = 10; 2 int *p = &a; 

                  ③ 易错点

                       1 %p输出指针里面存储的地址值 2 不能乱用类型,比如int a = 10; float *p = &a; 

            6、指针清空

                   

    1     p = 0;
    2     p = NULL;

    二、指针的注意事项

                

     1 //代码举例
     2 //不建议的写法, int *p只能指向int类型的数据
     3     int *p;
     4     double d = 10.0;
     5     p = &d;
     6     
     7     // 指针变量只能存储地址
     8     int *p;
     9     p = 200;
    10    
    11     
    12     // 指针变量未经过初始化,不要拿来间接访问其他存储空间
    13     int *p;
    14     printf("%d
    ", *p);
    15   
    16     
    17    
    18 
    19     // 定义变量时的*仅仅是一个象征,没有其他特殊含义
    20     int *p = &a;
    21     
    22     // 不正确的写法
    23     p = &a;
    24     
    25     // 这个时候的*的作用:访问指向变量p指向的存储空间
    26     *p = 20;

    三、指针和数组

         1、 指针对数组元素的访问方式

            

    1  int ages[5];
    2  int *p;
    3  p = ages;

            ① 数组名[下标]  ages[i]

            ② 指针变量名[下标] p[i]

            ③ *(p + i)

          2、 指针变量+1,地址值究竟加多少,取决于指针的类型

            int *   4

            char *  1

            double * 8

          3、数组与指针数据的传递

              

     1 //代码举例
     2 #include<stdio.h>
     3 void change(int array[]);
     4 
     5 int main()
     6 {
     7     // 20个字节
     8     int ages[5] = {10, 11, 19, 78, 67};
     9     
    10     change(ages);
    11     
    12     return 0;
    13 }
    14 
    15 // 利用一个指针来接收一个数组,指针变量array指向了数组的首元素
    16 void change(int *array)
    17 {
    18     printf("%d
    ", array[2]);
    19   
    20 }

       4、用指针遍历整个数组

           

    1 // 数组名就是数组的地址,也是数组首元素的地址
    2      p = ages;
    3 
    4      for (int i = 0; i<5; i++) {
    5      printf("ages[%d] = %d
    ", i, *(p+i));
    6      }

    四、 指针与字符串

         1、定义字符串的两种方式

             ① 利用数组

                 char name[] = "gaizuojia";

                  * 特点:字符串里面的字符是可以修改的

                 * 使用场合:字符串的内容需要经常修改

             ②  利用指针

                  char *name = "gaizuojia";

                  * 特点:字符串其实是一个常量字符串,里面的字符是不能修改

                  * 使用场合:字符串的内容不需要修改,而且这个字符串经常使用

      

    1  // 指针数组(字符串数组)
    2     char *names[5] = {"jack", "rose", "jake"};
    3     
    4     // 二维字符数组(字符串数组)
    5     char names2[2][10] = {"jack", "rose"};

    五、返回指针的函数

            返回指针的函数的一般形式为:类型名  *函数名(参数列表)

          

     1 #include <stdio.h>
     2 char *names();
     3 
     4 
     5 int main()
     6 {
     7     char *name = test();
     8     
     9     printf("name=%s
    ", name);
    10     
    11     return 0;
    12 }
    13 
    14 char *names()
    15 {
    16     return "gaizuojia";
    17 }

    六、 指向函数的指针

       1、定义指向函数的指针  

    1  double (*p)(double, char *, int);
    2 
    3         p = haha;

       或者  

    double (*p)(double, char *, int) = haha;

       2、如何间接调用函数

          ① p(10.7, "gaizuojia", 10);

          ② (*p)(10.7, "gaizuojia", 10);

       3、有返回值函数指针的定义

           

    1 // 定义指针变量指向sum函数
    2     // 左边的int:指针变量p指向的函数返回int类型的数据
    3     // 右边的(int, int):指针变量p指向的函数有2个int类型的形参
    4     int (*p)(int, int);

      4、 无返回值函数指针的定义

        

    1 // (*p)是固定写法,代表指针变量p将来肯定是指向函数
    2     // 左边的void:指针变量p指向的函数没有返回值
    3     // 右边的():指针变量p指向的函数没有形参
    4     void (*p)();
  • 相关阅读:
    YII2 Gridview 批量删除
    YII2 的复杂查询的一个例子
    Service.properties参数详解
    Kafka安装
    Zookeeper集群安装
    Kafka partition 副本迁移与broker上下线
    副本和分区状态机
    Controller机制
    replica副本同步机制
    Server端处理fetchRequest请求
  • 原文地址:https://www.cnblogs.com/gaizuojia/p/4356805.html
Copyright © 2011-2022 走看看