站群系列服务器做视频网站,门户网站做吗,wordpress move插件,企业域名注册Hi~#xff01;这里是奋斗的小羊#xff0c;很荣幸各位能阅读我的文章#xff0c;诚请评论指点#xff0c;关注收藏#xff0c;欢迎欢迎~~ #x1f4a5;个人主页#xff1a;小羊在奋斗 #x1f4a5;所属专栏#xff1a;C语言 本系列文章为个人学习笔记#x… Hi~这里是奋斗的小羊很荣幸各位能阅读我的文章诚请评论指点关注收藏欢迎欢迎~~ 个人主页小羊在奋斗 所属专栏C语言 本系列文章为个人学习笔记在这里撰写成文一为巩固知识二为同样是初学者的学友展示一些我的学习过程及心得。文笔、排版拙劣望见谅。 3、指针变量类型的意义 3.1指针的解引用 3.2指针 - 整数 3.3void *类型 4、const 变量 4.1const 修饰变量 4.2const 修饰指针变量
3、指针变量类型的意义 既然指针变量的大小与类型没有关系那为什么还要有不同的指针类型呢 在某些情况下指针类型还是有很大意义的。 3.1指针的解引用 这里来举一个例子探讨指针变量类型的意义。 如果对调试还不太熟悉可以看这篇文章 — VS调试技巧 观察下面代码在调试时内存中的变化 我们先给a赋值为0x1122334416进制在内存窗口可以看到然后再通过*pa将a该为0可以看到内存中也发生了相应的改变。 既然指针变量的大小都是一样的与指针的类型没有关系那我们用char *类型来接收a的地址按理说应该也可以而且a取出来的地址都是首地址一个内存空间大小是1个字节好像没什么问题。从上面调试的结果来看确实放进去了0x11223344这个值。 我们接着调试看一下结果 好像跟我们想的不一样执行完 *pa 0这条语句后只是把最小的地址一个内存单元中的值该为了0。这是为什么呢 因为指针类型决定了对指针解引用的时候有多大的权限也就是一次能操作几个字节。这就是指针变量类型的意义。比如char *类型的指针解引用访问一个字节int *类型的指针解引用访问4个字节。 3.2指针-整数 观察下面的代码 跟我们想的一样a、pa、pc的值是一样的但当我们给a、pa、pc加一个整数1的时候得到了不一样的结果通过观察a和pa的值都增加了4 而pc的值只增加了1。其中的原因还是和3.1中一样我们再来通过下面的图解释一下 可以理解为他们走的格数不一样一个格子就是一个内存单元也就是1个字节空间a和pa一个是int类型一个是int *类型所以它们走4个格子而pc是char *类型所以它走1个格子。 减一个整数也是同样的道理。 3.3void *类型 在指针类型中有一种特殊的类型是 void * 类型的为无具体类型的指针泛型指针这种类型的指针可以用来接收任意类型的地址。但是有一定的局限性void *类型的指针不能直接进行指针的 - 整数和解引用运算。了解了上面的内容这其中的原因相信我们已经心知肚明。 其实我们 char *pc a是有问题的a取出的地址毕竟是int *类型。虽然能正常运行但是编译器也有相应的警告 但是我们用void *去接受就没有任何问题 虽然void *类型的指针不能直接进行解引用操作也不能 - 整数的操作 但是当我们不知道别人给我们传的地址是什么类型的时候我们就可以放心地去用void *来接收这就是它的作用。 一般void *类型的指针是使用在函数参数的部分用来接收不同类型数据的地址这样的设计可以实现泛型编程的效果使得一个函数来处理多种类型的数据。在后面的文章中会深入探讨。
4、const 变量 4.1const 修饰变量 变量变量顾名思义就是可以改变的量当我们创建一个整整变量a并赋初值10int a 10如果我们想改变a的值随时就可以改谁让它是变量呢 那如果我们想训练一下这个变量a让它变得强大谁都改变不了它有没有办法呢 办法就是使用const修饰当我们用const修饰了变量a后它就拥有了常量的属性我们知道常量是不能被改变的量。 当变量a被const “训练” 过后我们再试图去改变它的值就会发现编译器报错说a是不可被修改的变量a得到了 “强化”。 但是const修饰的变量本质上还是变量只是不能被修改。我们也可以用例子证明这句话 前面的文章中我们说过创建数组的时候数组长度只能为大于0的整型常量或整型常量表达式不能包含变量。所以上面的例子就证明了变量a即使被const修饰具有了常量属性但本质还是变量。 4.2const 修饰指针变量 看了上面的内容我们可能会有一个想法。 在4.1中const修饰变量a后我们就不能改变a的值了但上面我们只是直接去改发现改不了那间接地去改呢因为上篇文章我们刚了解了一点指针知道通过指针的解引用操作可以间接地去找到、操作一些值那这里能不能创建一个指针变量pa将变量a的地址存到pa中再解引用pa来实现间接改变a的值呢 来实验一下我们的想法 可以看到我们的想法是有道理的通过指针的解引用操作确实间接地改变了a的值。 但是但是这样做其实是不对的。这就像门被锁了翻窗户一样锁门的目的就是为了不让别人进得去房间我们还为了进去而翻窗户肯定是不合规矩的。为什么要有const呢不就是为了让变量具有常属性不能被改变嘛那我们还去改变它就显得没事找事了。 不过虽然大多数的人都是守法公民但还是有个别不听劝的非要 “翻窗户”那有没有办法解决呢答案肯定是有的因为我们不能容忍任何一个人不 “遵纪守法”。 既然指针的解引用可以间接地去改变const修饰的变量的值那我们干脆把指针变量也用const修饰因为指针变量也是变量嘛。 const修饰指针变量时const可以放到 “ * ” 的左边也可以放到 “ * ” 的右边这样就会产生三种情况其中前两种情况的效果是一样的 const 放在 “ * ” 的左边 可以看到当我们改变 *pa 也就是改变a的值的时候编译器提示错误但改变 pa 的值是可以的。所以当const在 “ * ” 左边的时候修饰的是*pa 这时候*pa具有常量属性。 上面代码中改变pa的值事实上是改变了指针变量pa的指向也就是此时指针变量pa里面存的是变量b的地址。 const 放在 “ * ” 的右边 可以看到当const在 “ * ” 右边的时候改变*pa的值是可以的但改变指针变量pa的指向也就是改变指针变量pa里存的地址是不可行的。 所以当const在 “ * ” 右边的时候修饰的是pa这时候pa具有常量属性。 还有当 “ * ” 的左边和右边都有const修饰的时候*pa和pa都具有常量属性都不能改变。 如果觉得我的文章还不错请点赞、收藏 关注支持一下我会持续更新更好的文章。 点击跳转下一节 — C语言指针3