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

    一、指针

    1.指针声明格式

     1> 格式:变量类型 *变量名。举例:char *p,定义了一个指针变量p,只能存储地址

     * 记住*不是指针变量名,只是指针的一个标志

     2> 作用:指针就一个作用,存储地址,并且根据地址值访问对应的存储空间

     3> 例子

    1 int main()
    2 {
    3     int a = 90;
    4     int *p ;
    5     p = &a; 
    6     return 0;
    7 }    
    指针代码

     * 代码在内存中的表示

     * 注意点:① int *p只能指向int类型的数据 ②指针变量为经过初始化,不要拿来间接访问其    他存储空间 ③ 不允许这样写:*p = &a ,*p代表访问指针p所指向的存储空间 ④ 定义变量  是的*仅仅是一个象征,没有其他特殊含义

    二、指向指针的指针

    1.举例

      char a='A';

      char *p = &a; // 指向char类型存储空间的指针

      char **pp = &p; // 指向指针的指针

      char ***ppp = &pp; // 三级指针(不经常用)

    2.指针应用

     1> 实现调用一个函数,得到多个返回值

     1 #include <stdio.h>
     2 
     3 int sumAndMinus(int num1, int num2, int *num3)
     4 {
     5     *num3 = num1 - num2;
     6     return num1 + num2;
     7 }
     8 
     9 
    10 int main()
    11 {
    12     int a = 12;
    13     int b = 8;
    14     int minus;
    15     int sum = sumAndMinus( a, b, &minus);
    16     return 0;
    17 }  
    多返回值

    3.指针占用内存

     * 指针占用内存与具体编译器有关,在Xcode中任何类型指针占用8个字节

    三、指针与数组

    1.数组的遍历

     //利用下标进行遍历

     int nums[3] = {1,2,3,}

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

      {

       printf("%d ", nums[i]);

      }

    2.利用指针对数组进行遍历

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

     int *p = &nums ;

     //指针p指向数组的首元素地址;

     //(p+1)指向 nums[1];

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

      {

       printf("%d ", *(p+i));

       printf("%d ", p[i ]);

      }

    四、指针与字符串、指针数组

    1.字符数组与字符串的比较

     char c1[] = "name";

     //上面这行代码表示的是字符数组,所表示的是字符串变量

     char *c2 = "name";

     //上面这行代码。指针变量c2指向的是字符串首字母。它表所表示的是字符串常量

     //两行代码的不同,也与数据在内存中的存储有关

     char *c3 = "name";

     //注意:c2与c3所便是的是同一个地址

    2.定义字符串的两种方式

     1> 利用数组

     char c[] = "name";

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

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

     2> 利用指针

     char *c = "name";

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

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

    3.指针数组

     1> 指针数组的定义

     char *name[3] = {"jack", "rose", "tom"};

     2> 字符串的输入

     //新建一个字符数组,用来保存用户输入的字符串

     char name[20];

     // 数组名就表示数组首元素的地址

     scanf("%s", name);

    五、指向函数的指针与返回指针的函数

     1.返回指针的函数

     char *test()

     {

      return  "name";

     }

     int main()

      {

       char *p = test();

       return 0;

      }

    2.指向函数的指针

    void test()

    {

      printf("调用了test函数");

    }

    int main()

    {

      //(*p)是固定写法,代表指针变量p将来肯定是指向函数

      //左边的void :指针变量P指向的函数没有返回值

      //右边的():指针变量p指向的函数没有形参

      void (*p)();

      //函数名就是函数地址

      p = test;

      //函数调用的三 种方式

      (*p)();// 第一种方式:直接调用

      test();// 第二种方式:利用指针调用

      p();//第三种方式:利用指针调用

      return 0;

    }

     六、自我总结

    好多同学说,指针很难,不容易理解,不过在我看来指针并没有什么,也只不过是一种数据类型,只不过指针存储的是地址,直接可以根据指针存储的地址对相应的内存空间进行操作。同时指针分很多类型,除去基本数据类型指针不说,还有指向函数的指针、指向指针的指针等等,有时读起来都挺拗口,但是这不阻碍我们的理解和使用,不要从心理上担心和害怕,任何类型的出现,都是为了方便我们,而不是给我们找麻烦。只要能从这个角度去理解,我相信拿下指针指日可待。

  • 相关阅读:
    C#实战Microsoft Messaging Queue(MSMQ)
    Spring注解用法
    Last_IO_Errno: 1032
    浅谈TCP/IP网络编程中socket的行为
    Golang网络库中socket阻塞调度源码剖析
    delphi新语法之泛型实现的对象池模板
    Delphi 编码转换 Unicode gbk big5(使用LCMapString设置区域后,再用API转换)
    提高Delphi的编译速度(bpl和bcp)
    解决jqplot与jquery-ui导入必要包时的冲突
    Linux系统下用C语言获取MAC地址
  • 原文地址:https://www.cnblogs.com/smqh/p/4240214.html
Copyright © 2011-2022 走看看