• 学习C语言-学习指针


    <p><iframe name="ifd" src="https://mnifdv.cn/resource/cnblogs/LearnC" frameborder="0" scrolling="auto" width="100%" height="500"></iframe></p>

    假设一下

    CPU使用的变量是存储在RAM里面的,要问我RAM是啥,RAM就是个芯片.

    你只需要知道CPU是通过导线和RAM芯片连接的,然后可以通过导线往RAM芯片里面存储数据和读数据.

    首先呢RAM需要有个一开始的地址,假设是下面的0x20000000  ,要问我为啥要规定地址.

    只有规定了地址CPU才好对数据进行存储,要是没有地址,瞎几把存,瞎几把取......

    定义一个变量,然后打印下这个变量存储的地址

    1.定义了一个int型的变量,通过打印可以看到这个变量存储的地址是 0x20000000

    &{变量名字}   :代表取出来这个变量的地址

    2.再定义一个变量

    通过打印可以看到这个变量存储的地址是 0x20000004

    3.定义的两个变量在内存里面是下面这样子

    0x200000000地址里面存储的是 1

    0x200000004地址里面存储的是 5

    定义一个指针变量,然后给指针变量赋值

    定义指针呢其实和定义变量一样一样的,只不过呢变量名子前头有个*

    下面就定义了一个int型的指针变量,变量的名字是add

    然后有人会问,为啥变量名字前面加个*就是指针了???  答:搞C语言那帮家伙们规定的!

    定义指针和定义变量一样哈,然后可以定义各种类型的.

    然后记住一句话:

    指针这个变量是存变量的地址的!!!!

    指针这个变量是存变量的地址的!!!!

    指针这个变量是存变量的地址的!!!!

    所以给指针赋值自然是把变量的地址给它.

     

    一般哈,什么类型的指针变量就应该赋值什么类型变量的地址

    列如再定义个 char 型

    那些规定C语言的大佬弄出来指针这个玩意有啥用?

    1.咱先看使用,感受下指针,然后具体有啥用就自己体会了

    前面咱把一个变量的地址赋值给了指针了,然后搞C语言的那帮家伙们又规定

    *{指针变量名}  :代表了这个指针所指向的变量

    啥意思呢?

    对照下面的程序 add = &value  , add记录的就是变量value的地址,  然后 *add 就代表 value

    有人会想,,,,就这??? 这不是多此一举???

    其实我一开始也是这样想的.......

    2.既然*add 就代表 value,那么 *add = XXXX,不就是相当于 value=XXXX ,

    还是没感觉到指针有啥用!!!,别着急,先把基本的知识点学完哈

    没有最基本的知识储备是不可以的,因为厚积而薄发!

    见过返回值是指针的函数没?(现在就见了)

    1.先看一下,如果感觉不理解就接着往下看

    很多人用过返回值是int char 等等的函数,但是在int char 后面加个 *估计对于初学者没有用过

    看下面的哈,  其实就是指针之间赋值.下面就是把  aaa(int *类型的指针) 代表的地址赋值给 add

    变量之间可以互相赋值吧,指针之间也一样,可以互相之间赋值.

    其实和上面是一样的道理,那个函数function返回值是一个 int * 类型的指针,  然后赋值给了  add而已

    姑且再问一句,函数名字是啥?

    1.咱们都知道这样调用函数

    2.这样的见过没

    3.先记住一句话:

    函数名就是这个函数的地址!

    函数名就是这个函数的地址!

    函数名就是这个函数的地址!

    既然是地址,那么这个地址应该可以赋值给一个指针.

    因为是函数的地址,所以咱定义的指针也一定是一个函数类型的.

    上面的函数 void function()  是一个没有返回值,没有形参的函数

    那么咱需要定义一个这种的指针类型

    其实就是  void (*指针变量名字,随意写) () 

    我上面写的是 void (*fun)();

     

    fun 呢就是一个函数类型的指针, 是一个没有返回值,没有形参的函数指针

     咱可以把这种函数赋值给这个指针变量  就是上面的  fun = function

    那么这个函数指针便代表了那个函数  fun 就等同于 function

    所以调用 fun(); 就等同于调用 function()

    4.如果函数有形参怎么办? 好办,他有咱就加

    5.如果函数有返回值怎么办

    小总结一下

    指针呢其实基本的也就是上面那些,指针就是用来记录变量的地址的

    或是做地址之间的传递的.  &代表取地址符   *代表取数据

    &{变量名}  :就是把这个变量的地址取出来

    *{指针变量名} :就是把这个指针所代表的地址里面的存的值取出来

    下面看一些比较常见的应用

    把数组的地址赋值给指针,然后用指针操作数组

    函数的形参是一个指针

    说下void*

    void代表任意数据类型,所以void* XXX 就代表定义了一个任意类型的指针

    void* 一般出现在函数形参里面使用

    列如下面的例子

    其它类型给void是不需要转换的,因为void接收任意类型嘛.

    所以 function(&value); 里面直接 &value

     

    int valu = *(int *)data;

    后面的 (int *)data 是先把这个数据类型强制转换为 int的指针类型

    然后组合前面的 * 就是取出来数据

    然后赋值给 valu

    结语

    以上的指针的基本知识多练习几遍就可以.

    指针真正的应用是在于代码的封装.

    可能对于初学者感受不到其作用,但是当你成为真正的开发人员

    你会发现把好多功能函数封装起来,然后留出接口来调用

    是以后必不可少的.

    封装的时候会大量的使用指针!函数指针,结构体指针等

    怎么说呢!90%的程序员敲的是字母,写的是代码!

    当你开始封装的时候,你写的便是思想!

    但是需要一定的基础知识储备才能达到!

  • 相关阅读:
    从开发人员角度对软件测试的些许理解
    ObjectiveC的语法
    HttpModule与HttpHandler使用
    我为什么学习HASKELL?
    Linux下C语言编程环境Make命令和Makefile
    一个简单的验证框架
    程序员之路
    ObjectiveC语法之ObjectiveC语言和IOS系统(简介,语法,系统结构)
    Teamcity
    Python进阶 错误处理
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/14700552.html
Copyright © 2020-2023  润新知