学习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%的程序员敲的是字母,写的是代码!
当你开始封装的时候,你写的便是思想!
但是需要一定的基础知识储备才能达到!