• 【C语言】指针的定义、概念和运用


    一、地址和指针的概念

    【问题】数据在内存中是如何存储和读取的?
    在程序中定义一个变量后,在对程序编译的时候,系统就会给这个变量分类内存单元。编译系统根据程序中定义的变量类型,分配一定长度的空间。例如:一般整型为2个字节,单精度浮点类型分类4个字节,对字符型分配一个字节。内存区的每一个字节有一个编号,这就是“地址”。
    一定要弄清楚内存单元的地址域内存单元的内容这两个概念。以宾馆房间号为例,地址就是房间号,单元内容就是住在这个房间里的客人。在程序中一般通过变量名来对内存单元进行存取。其实,程序经过编译以后已经将变量名变为变量的地址,对变量值的存取都是通过地址进行的。
    【直接 访问】
    按照变量地址存取变量值的方式称为直接访问。
    【间接访问】
    将变量的地址存放在另一个变量中,它是一种特殊的变量,用于存放地址。
    【总结】
    在C语言中,将地址形象的称之为“指针”。意思是通过它能够找到以它为地位的内存单元。一个变量的地址称为“指针”。一个变量专门存放另一个变量地址的变量,称之为“指针变量”。指针是一个地址,为指针变量是存放地址的变量。

    二、变量的指针和指向变量的指针变量

    为了表示指针变量和它所指向变量之间的联系,在程序中用“*”符号表示“指向”的对象。如果已经定义i_pointer为指针变量,则(*i_pointer)是i_pointer所指向的变量。例:

    • i=3;
    • *i_pointer = 3;

    1.定义一个指针变量

    C语言规定,所有变量在使用前必须定义,指定其类型,并按照此分配内存单元。指针变量不同于整型变量和其它类型的变量,它是专门用来存放地址的,必须将它定义为“指针类型”。
    
    • 1
    int  i,j;
    int *pointer_1,*pointer_2;
    
    • 1
    • 2
    第一行定义了两个整型变量,第二行定义了两个指针便变量:pointer_1和pointer_2,它们是指向整型变量的指针变量。
    
    • 1

    怎样使一个指针变量指向另一个变量呢?
    可以使用赋值语句是一个指针变量得到另一个变量的地址,从而使它指向该变量。

    pointer_1 = &i;
    pointer_2 = &j;
    
    • 1
    • 2

    将变量i的地址放在指针变量pointer_1 中,因此pointer_1 就指向了变量i.
    在定义指针时注意两点:

    • 指针变量前面的“*”便是该变量的类型为指针型变量。指针变量名是pointer_1和pointer_2。
    • 在定义指针变量时必须指定基类型。

    2 指针变量的引用

    指针变量只能存放地址,不要将一个整数赋值给一个指针变量。例“

    
    ```c
    #include
    void main()
    {int a,b;
     int *pointer_1,*pointer_2;
     a = 100;b = 10;
     pointer_1 = &a;
     pointer_2 = &b;
     printf("%d,%d\n",a,b);
     printf("%d,%d\n",*pointer_1,*pointer_2);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行结果

    100,10
    100,10

    3.指针变量作为函数参考

    函数的参数不仅可以时整数、浮点型、字符型等数据,还可以时指针类型。它的作用是将一个变量的地址传到另一个函数中。例:

    #include
    void main()
    {void swap(int *p1,int *p2);    //函数的声明
     int a,b;
     int *pointer_1,*pointer_2;
     scanf("%d,%d\n",&a,&b)
     pointer_1 = &a; pointer_2 = &b;
     if(a<b) swap(pointer_1,*pointer_2); 
     printf("%d,%d\n",a,b);
    }
    
    void swap(int *p1,int *p2)
    { int temp;
      temp = *p1;
      *p1 = *p2;
      *p2 = temp;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    运行结果:

    5,9
    9,5

    形参值的改变不能使实参值发生改变。而应该用指针变量作为函数参数,在函数执行过程中使用指针变量所指向的变量值发生变化,这样就实现了”通过调用函数是变量的值发生变化,在主调函数中可以使用这些改变了的值‘的目的。
    C语言中实参变量和形参变量之间的数据传递时单向的“值传递”。指针变量作为函数函数也要遵守这一规则。不可能通过调用函数来改变实参指针变量的值,但可以改变实参指针变量所指变量的值。

  • 相关阅读:
    版本管理 | 如何解决SVN的合并冲突与分支问题?
    2022-07-29 网工进阶(二十二)BGP-其他特性(路由过滤、团体属性、认证、AS欺骗、对等体组、子路由器、路由最大接收数量)
    P8719 [蓝桥杯 2020 省 AB2] 字串排序题解
    将毫秒数述转为时分秒格式
    【CSS】CSS入门笔记第三弹~
    云原生k8s之Pod基础概念
    为什么HashMap头插法会造成死循环?
    【PRIVGUARD-privguard-artifact-main】代码学习(parser部分)
    产品新人必看:入职前的准备及快速适应产品工作
    Java程序设计(边学边练)(二)
  • 原文地址:https://blog.csdn.net/rouranling/article/details/126247522