[黑马程序员]C语言指针初识

时间:2021-10-21 12:45:18

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

0x00 地址的概念

在现实生活中,要去找到某一个人,需要先得到那个人所在地址,然后我们按照地址去找到这个人。在计算机系统的内部存储器中,拥有大量的存储单元(1个单元为1个字节),与现实世界一样,每一个存储单元有一个编号,这个编号就是存储单元的“地址”,每一个存储单元都有一个唯一的地址。
[黑马程序员]C语言指针初识


0x01 指针的作用

指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。—— [百度百科]

[黑马程序员]C语言指针初识
指针变量里面记录了一块内存区域的具体地址,可以通过指针变量直接更改该地址的值。就好像一个人知道xx路12号在什么地方,人知道这个具体的地方可能还需要拿出手机查询一下路线,指针是不会迷路的。

使用指针的好处:

  • 0.为函数提供修改调用变量的灵活手段;
  • 1.让函数有多个返回值;
  • 2.可以改变某些子程序的效率(数据传递,数据库比较大,使用指针传递而不使用实际数据,即提高传输速度,又节省大量内存);
  • 3.为动态数据结构(如二叉树、链表)提供支持;

0x02 指针的使用

指针的定义:与普通变量定义一样,不同类型的指针变量使用不同的关键之定义;

int *pNum;       //一个指向整型变量的指针
char *pChar;     //一个指向字符型变量的指针
...

注意:*是指针的标志,定义的时候必不可少的;指针变量只能存放地址,不能用于存放其他常量值;指针变量只能指向同类型的变量;指针也可以声明为全局、静态局部和局部的。

指针变量初始化与赋值:

int a = 100;          //一个整型变量
int b = 200;
int *pNum = &a;     //一个指向整型变量的指针,初始化指向变量a
pNum = &b;          //更改pNum指针变量的指向地址
*pNum = 20;         //更改pNum指针变量的指向地址的数据
pNum=NULL;          //给pNum指针变量赋予空值

&-取地址,从以上代码可以看出,给指针变量单独赋值的时候不用带上*,更改指向地址的数据必须带上*


0x03指针的常见应用场景

  • 0.在函数中通过指针更改传入变量的值
void change(int *n)
{
   *n = 100;
}
  • 1.让函数可以有多个返回值
//add mul 为返回值,调用的时候需要传入变量地址
void Calculation(int a, int b, int *add, int *mul)
{
   *add = a + b;
   *mul = a * b;
}

0x04 二级指针

如果一个指针变量存放的又是另一个指针变量的地址,则称这个指针变量为指向指针的指针变量,也称为“二级指针”。

int a=100;             //一个整型变量
int *pNum1 = &a;       //一个指向整型变量的指针变量
int **pNum2 = &pNum1;  //一个指向整型指针变量的指针

*pNum2 = pNum1 = &a ;**pNum2 = *pNum1 = a; 定义二级指针,*也是两个。


0x05 为什么指针要区分类型

在同一个编译环境下,指针变量所占用的内存大小是固定的。在16位编译器环境下,任何一个指针变量都占用2个字节;61位编译器环境下,任何一个指针变量都占用8个字节。但是,不同类型的变量占用的字节大小是不一样的,如果指针不区分类型,将会导致数据取不完全或者溢出的可能性。比如char型占用1个字节,指针变量占用8个字节,取值的时候指针变量将会多取到7个字节,这样获取的值就是错误的。所以,指针要区分类型。


0x06 总结

指针的使用远远还不止这么简单,还有更复杂的多级指针。本文只是记录了指针的初级用法,更高级的还等着我慢慢学习,如果有理解错误的地方,欢迎各种拍砖、吐槽…