这是我的第一篇博客,弱鸡开始学写博客了,希望大家多多支持,欢迎各位大佬指正,下面是我的一些学习的总结与认识!!
1初始指针
一、初始指针
1.1 指针是什么?
指针是什么呢?指针对于我们写代码,或者编写一些比较复杂的程序时都有着很大的用处,指针也是比较难理解,对于新手难应用的内容,下面我来以我自己学习,来总结一下。
①指针是内存中一个最小单元的编号,而内存中的存储区域会有一个一个编号表示,而编号的作用其实就是和宿舍的门牌号一样,实际上就是就是一个地址。
②我们平时口中说的指针,通常说的是指针变量,而指针变量其实就是用来存放内存地址的变量!
PS:指针实质上是地址,而口语中说的指针是指针变量。
那我们想要更清楚的了解指针我们就有走到内存里去看,如我们在编译器中输入这段代码:
先设置一个变量a,将一串16进制的数字存入a变量,编译器就会自动分配空间将他存储到内存中。然后我们用一个指针变量将变量a的地址存到指针变量中(将它存入指针变量的原因是,存入后我们就可以通过修改这个指针变量的内容来直接修改变量a的值,也就是第三行*p=0;)。
现在我们进入调试代码的步骤,走到内存中去看指针的变化:
在监视内存的窗口中输入你想要查看的地址,比如我们这里要查看a的地址就输入&a来获得a的地址。
获得地址后,我们将看到一下的结果,此时的0x00B3F9A4,其实就是变量a的地址,里面也能看到存储着和我们一样要存的值0x11223344。
然后我们来到下一步调试,到*p=0的执行,我们可以看到a的地址上的值全都变成的0,也就说明了变量可以通过修改指针变量来修改该地址上存的值。
所以指针的作用就是在内存当中体现的。
这里还讲到一个指针变量的东西,
首先,变量其实就是可以存储常量的东西,比如我们这里的a就是一个变量,0x11223344其实就是一个常量。同理指针变量就是可以存储地址的东西,因为某一个地址是固定的地址,和10一样就是10,所以我们要通过“&”,将变量的地址取出来得到地址。
指针变量是指通过&(取地址操作符)取出变量的内存的起始地址,把地址存放到一个变量中。也就是这串代码中的int*p。
PS:指针变量就是用来存放地址的变量。(存放在指针中的值都被当成地址处理)
2.指针和指针类型
指针的类型有int*,char*,short*,double*等等,如
但他们和数据类型int,char等等所占内存空间不同,我们都知道不同的数据类型作为变量,在内存所占空间都不一样,如int占内存空间是4个字节,char是1个等等都是不相同的,而指针的所有指针类型都是占4个字节。
这个时候就有人疑惑了,这些指针变量占的内存的一样,
那么这些指针变量的区别是什么呢?
好,接下来我们就讲一下它们有什么用,区别在哪里!
2.1指针“+”,“-”整数.
①指针类型决定了:指针进行解引用操作的时候访问几个字节(的权限)
就比如说:char*的解引用会访问1个字节的内容,int*的解引用会访问4个字节的内容,同理double*会访问8个,short*会访问2个。好,让我们继续走到内存中去了解
如:我们之前演示整形数据a在内存中所占空间的样子0x就代表这个数字是16进制,而他的11223344就代表数值,所以11223344刚刚好就占一个整形,也就是4个字节,所以11或者22或者33就占1个字节。
那当我们将整个整形指针类型赋值为0时,四个字节的内容都会改变成赋值内容,即:
当我们选择用char*类型的指针变量去赋值给这个整形变量时,就会只改变一个字节的内容,即:
所以不同的指针类型的作用就是对地址中不同存储位置的数值进行访问,用什么样的类型就会访问不同的字节数的值。
那么有的同学就会问了,要是我存int型的数值,用double*去访问会怎么样??
好,那么我们就试试
那么我们可以看到,八个字节的内容都被修改了。表面上看着没什么大事,反正都是改为0,我用int*也是为0,没什么影响。但是想想如果我是在int型的数组中用double*去修改数值,而且在数组中地址都是连续,我们一个double*不就改变了两个int型数字的值了嘛!!所以我们不要皮,皮的话,嘿嘿,后果就不堪设想。
讲完了指针类型的区别之后,我们再来了解一下指针变量+、-整数会怎么样。
②指针类型决定了指针的步长(向前)向后,走一步要多大的距离。
比如int*指针+1,意思就是跳过一个整型大小的内存,也就是向后走4个字节
同理char*指针+1,就是跳过一个字符的内存,也就是向后走1个字节,
那么double*指针+1就是跳过8个字节
我们还是走进内存中去看,首先我们从地址的改变来看一下区别,比如:
可以看到当我们不论时用int*,还是char*去取a的地址获得的都是这个变量的首地址,所以是相同的,但是我们将他们的指针+1去看=打印他们的地址时发现
int*+1是由4C变成50,其实他就是由4C到4D到4E到4F到50走了4个字节,而
char*+1是由4C变成4D,也就是走了1个字节。
(这里涉及到16进制数的表示,不懂的同学留言,下次我给你们好好讲)
所以到最后面打印出来的结果就是不同类型的指针变量进行+整数,它的地址就会跳过相应类型的字节数去指向下一个地址。
现在我们又从数值的改变来看一下,这样子把指针跳来跳去有什么用,如:
之前我们就知道如果直接用一个char*指针变量直接赋值为0,只会修改一个字节的内容
那么我们让char*+1再进行赋值,其实也就是跳过第一个字节然后进行赋值,如:
对跳过1个指针变量之后进行赋值,就可以直接跳过相应的字节数去修改你想修改的位置上的值。
结束---------
下一次我还会继续讲关于指针的应用,还用应用指针的注意事项
初识指针就先到这里了,因为指针的道理真的是太大了,我对搞懂指针也是花了好大功夫,我初学的时候也觉得指针好难好难,所以就讲得比较多,比较啰嗦,尽量讲得详细一点让刚接触的同学们能够弄懂指针是个什么东西,希望能帮到还搞不懂的同学们,也希望各位大佬能指正我的错误,我也是新同学。然后就是第一次写博客,还不怎么熟悉写博客工具的使用,比如说目录啊,代码段啊,还有标题啊等等,还有对文字和截图的排版,希望大家多多理解,我会慢慢继续学习,创作更多的东西出来和大家分享,请大家监督。