学习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%的程序员敲的是字母,写的是代码!

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

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

 

 

posted on 2021-04-25 15:38  广源时代  阅读(321)  评论(1编辑  收藏  举报

导航

支付宝 QQ群