校园论坛网站怎么做,wordpress s7,semi final,网站开发翻译功能#x1f308;个人主页#xff1a;是店小二呀 #x1f308;C语言笔记专栏#xff1a;C语言笔记 #x1f308;C笔记专栏#xff1a; C笔记
#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 **内存和地址(知识铺垫(了解即可))**如何理解编址**指针变量*…
个人主页是店小二呀 C语言笔记专栏C语言笔记 C笔记专栏 C笔记
喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 **内存和地址(知识铺垫(了解即可))**如何理解编址**指针变量****指针的初始化和赋值运算****指针变量的大小****指针变量类型的意义****指针-整数**const修饰指针const修饰变量const修饰指针变量**指针运算****野指针****assert断言assert.h头文件定义了宏assert()****传值调用和传址调用** 内存和地址(知识铺垫(了解即可))
内存(Memory)是计算机的重要部件也称内存储器和[主存储器]它用于暂时存放CPU中的运算数据以及与硬盘等[外部存储器]交换的数据。
当CPU中央处理器在处理数据的时需要的数据是在内存中读取的处理后的数据也会放回内存中。
问题:那么内存空间如何高效的管理的呢?
是将内存划分为一个个的内存单元每个内存单元的大小取一个字节(一个字节等于八个比特位比特bit是二级制位Binary digit的简称一个二进制包含的信息量成为一比特bit。每个内存单元都有一个编号(相当于宿舍房间的门牌号)有这个内存单元的编号CPU就可以通过这个编号快速找到一个内存空间在计算机中我们把内存单元的编号也称为地址。C语言给地址起了个新名字位指针这里解释了计算机中内存是按照字节编址的也是每个字节都有唯一的地址而对于比特是没有地址可以理解为:内存单元的编号地址 指针 如何理解编址
CPU访问内存中的某个字节空间必须知道这个字节空间在内存的什么位置因为内存中有很多字节所以需要给内存进行编制计算机中的编址不是把每个字节的地址都记录下而是通过硬件设计完成。
钢琴、吉他上面没有写上“都瑞咪发嗦啦”这样 的信息但演奏者照样能够准确找到每⼀个琴弦的每⼀个位置这是为何因为制造商已经在乐器硬件层面上设计好了并且所有的演奏者都知道。本质是⼀种约定出来的共识
首先计算机内是有很多硬件单元的而硬件单元是要相互协同工作既然是协同工作至少之间要能够进行数据传递但是硬件和硬件之间是互相独立的那么如何通信呢?那么需要通过线连起来那么CPU和内存之间也是有大量的数据交互所以这两者必须也用线连起来。 这里只关注一组线:地址总线
可以简单理解为32位机器有32根地址总线那么每根线只有两态表示01【电脉冲有无】一根线能代表两种含义两根线就能表示四种含义依次类推。32根地址线就能表示2^32种含义每一种含义都代表一个地址。
地址信息被下达给内存在内存上就可以找到地址对应的数据将数据在通过数据总线传入CPU内寄存器中 ##正文
指针变量
了解内存和地址的关系可知创建变量需要向内存申请一定大小的空间
指针变量时用于存放其他变量的地址其他变量在内存中存储的位置简称指针。指针本身是一种变量需要占用一定大小的空间的用来存放指针值(指针变量本身的地址)。
指针定义说明的一般形式:
类型说明符void *指针变量名name;
*表示pa是一个指针变量
类型说明符表示指针变量指向什么类型的对象比如:
int p1;char qa;
int *pap;说明指针变量pa是指向int类型变量的指针
char *qaq;说明指针变量qa是指向char类型变量的指针注意:
指针变量值表达的是某个数据对象的地址只允许取正的整数值的。但是他不等同于整形类型变量如果指针变量取0值即为NULL(空)则表示指针指向对象不存在为空指针 指针的初始化和赋值运算
类型说明符 指针变量名初始化地址值
注意:
初始化中也是将初始地址赋值给指针变量在赋值语句中变量的地址也只能赋值给指针变量这种赋值运算操作限制在同类之间
## 指针运算符 、*
取地址操作符 :返回存放其他变量的内存地址(只限于一个具体的变量或数值元素不可用于表达式)
int p1;
int *pap;//这里pa存放p的地址*解引用操作符 :返回地址(指针标量指向的地址)中的变量值
int p1;
int *pap;//这里pa存放p的地址
int ret*pa//ret1这里样对于变量的修改多了一种途径写代码就会更加灵活 指针变量的大小
通过前面“内存和地址”32位机器有32根地址总线每根地址线出来的电信号转换成数字信号后(1或0)将32根地址线产生的二级制序列当做一个地址那么一个地址需要32个bit位也是4个字节存储。那么在64位机器有64根地址总线一个的地址就是64个二级制位组成的二级制序列那么一个需要地址需要64个bit位也是8个字节存储。
小总结:
指针变量是用来存放地址的那么在不同机器下地址的大小也会影响指针变量的大小
32位平台下地址是32个bit位指针变量大小是4个字节64位平台下地址是64位bit位指针变量大小是8个字节指针变量的大小和类型是无关的只要指针类型的变量在相同的平台下大小都是相同的 指针变量类型的意义
既然指针变量的大小与指向的类型无关那么为什么要区分各种指针类型呢?
那当然是因为指针类型在其他方面有特殊的意义
#include stdio.hint main()
{int n0x11223344;int *p1n;*p0;int m0x11223344;char *p2(char *)m;//原本m 应该由int *类型存储*pc0;return 0;
}
这里涉及到了大小端的知识理解指针类型对解引用的影响如图可得的n的四个字节全部改为0而m只是第一个字节改为0
结论:指针的类型决定对指针解引用能修改几个字节的权利
拿上面的例子: n是int 类型占四个字节其中两个数字算一个字节int *指针类型指向n的地址*当解引用的时候int 指针只能访问四个字节 m是char 类型占一个字节其中两个数字算一个字节char *指针类型指向m的地址*当解引用的时候char 指针只能访问一个字节(修改44) 指针±整数
代码:
#include stdio.h
int main()
{
int n 10;
char *pc (char*)n;
int *pi n;
printf(%p\n, n);printf(%p\n, pc);
printf(%p\n, pc1);printf(%p\n, pi);
printf(%p\n, pi1);
return 0;
}结论:指针类型决定了指针向前或者向后走一步有多大(距离)。char *类型的指针变量1跳过1个字节int *类型的指针变量1跳过了4个 const修饰指针
const修饰变量
如果不希望这个变量被修改可以使用const进行限制。
int main()
{const int m0;m1;//ok
}上边的代码:使用const修饰(语法上加了限制)只要对n变量进行修改就不符合语法规则就会报错对于const修饰后的变量是不能进行直接修改的.
通过上面刚学的一种修改变量的方法通过n的地址取修改n值(打破语法规则)
int main()
{const int m0;int *pm;*p20;return 0;
}这样子n变量还能被修改const使用的就没有多大意义这样子不是自己打自己脸吗那么有什么办法p拿到了n的地址也不能修改n值(对指针下手)。
const修饰指针变量
int main()
{int m0;int n1;第一种:const int *pam;pan;*pa10;//右边为不可修改值第二种: int * const pam;pan;//左边为不可修改值*pa10;
}总结:当const修饰指针变量的时候
const放在*的左边修饰的是指针指向的内容保证指针指向的内容不能通过指针来改变但是指针变量本身的内容可变const放在*的右边修饰的是指针变量本身保证指针变量的内容不能修改但是指针指向的内容可以通过指针改变 指针运算
指针的基本运算有三种
1.指针±整数(在连续存放的数据只要知道第一个元素的地址就可以知道后面所有的地址)这里整数也称为偏移量
数组int main()
{int nums[]{1,2,3,4,5};int *pnums;//首元素的地址printf(%d,*(p2));//那么p的偏移量为2打印结果是3return 0;
}2.指针-指针
int main()
{char *pabcd;//不要忘记还有\0char *sp;while(*p!\0){p;}int retp-s;//4printf(%d,ret); return 0;
}结论:指针减指针表示指向两个指针之间的元素个数求首元素到某个元素之间相错个数(在连续存储的情况下)
3.指针的关系运算
int main()
{
int arr[10] {1,2,3,4,5,6,7,8,9,10};
int *p arr[0];
int i 0;
int sz sizeof(arr)/sizeof(arr[0]);
while(parrsz) //指针的⼤⼩⽐较
{
printf(%d , *p);
p;
}
return 0;野指针
野指针指针指向位置是不可知的(具有不确定因素)
下列有几种野指针的成因
1.指针未初始化int *p;
2.指针越界访问(数组越界访问)
int nums[10]{0};
int *pnums;
for(int i0;i11;i)
{*(p)i;
}3.指针指向的空间释放
int* test()
{int m0;return m
}
int mian()
{int *ptest();printf(%d\n,*p);return 0;
}
m是一个被销毁的局部变量这里指针指向m所在的位置空间是不明确的原本属于m的空间可能被给了其他变量占用这样子就导致程序可能不能达到预期效果规避野指针
1.确定指针指向一片有效的空间如果指针目前没有指向可以为指针赋值为NULLNULL是一个定义的标识符常量值为00也是地址这个地址是无法使用的
2.当指针变量不再使用设置为NULL指针使用之前检查有效性(判断语句或者断言)
3.规定:只要指针为NULL就不去访问但是给野指针赋值为NULL将野指针暂时管理起来还是存在危险的。 assert断言assert.h头文件定义了宏assert()
作用:当符合程序符合指定条件没有啥影响如何不符合条件就会报错终止运行。而这个宏常称为断言。
具体使用细节:
#inlclude assert.h
int p0
assert(p!0);assert()宏接受一个表达式作为参数。如果表达式为真(返回值为非零)没有啥影响程序继续执行。如果表达式为假(返回值为零)assert()就会报错在标准报错流中stderr中写入一条错误信息(显示没有通过的表达式、表达式文件名和行号)
好处:
自动标识文件和出问题的行号存在一种无需更改代码就能开启或关闭assert()的机制就是在#include assert.h语句的前面定义一个宏NDEBUG
#define NDEBUG
#include stdio.h对于宏NEDBUG使用时编译器就会禁用文件中assert()语句。如果程序出现问题可以注释掉就可以重新启动assert()语句
不足:assert()的引入了额外的检查增加了程序的运行时间
在debug和release版本下一般debug调试中使用在release(发布版本)选择禁用assert提高程序效率。在VS这样的集成开发环境中release版本中直接优化掉了。
总结:debug版本有利于程序员排查问题release版本不行用户使用程序的效率 传值调用和传址调用
在函数章节,提到形参是实参的一份临时拷贝形参的改变不会影响到实参
#include stdio.h
void Swap(int x,int y)
{int tmpx;xy;ytmp;
}
int main()
{int a10;int b20;Swap(a,b);
}这里x和y的值等于a和b的值但是各属于独立的空间那么x和y值交换不会影响到实参a和b值的交换
对于这种将变量的数值传递给函数调用方法传值调用
对此可以使用指针
#include stdio.h
void Swap(int *x,int *y)
{int tmp*x;*x*y;*ytmp;
}
int main()
{int a10;int b20;Swap(a,b);
}这里在main函数中将a和b的地址传递给了Swap函数Swap函数通过地址间接的操作main函数中的a和b
对于这种将变量的地址传递给函数调用方法传址调用 谢谢大家的观看这里是个人笔记希望对你学习C有帮助。 文章转载自: http://www.morning.qtqk.cn.gov.cn.qtqk.cn http://www.morning.wbqk.cn.gov.cn.wbqk.cn http://www.morning.krhkn.cn.gov.cn.krhkn.cn http://www.morning.tgyzk.cn.gov.cn.tgyzk.cn http://www.morning.hdzty.cn.gov.cn.hdzty.cn http://www.morning.rzbcz.cn.gov.cn.rzbcz.cn http://www.morning.fldrg.cn.gov.cn.fldrg.cn http://www.morning.jypsm.cn.gov.cn.jypsm.cn http://www.morning.ypcd.cn.gov.cn.ypcd.cn http://www.morning.swimstaracademy.cn.gov.cn.swimstaracademy.cn http://www.morning.nqgjn.cn.gov.cn.nqgjn.cn http://www.morning.lxthr.cn.gov.cn.lxthr.cn http://www.morning.wbdm.cn.gov.cn.wbdm.cn http://www.morning.yrck.cn.gov.cn.yrck.cn http://www.morning.zpdjh.cn.gov.cn.zpdjh.cn http://www.morning.gftnx.cn.gov.cn.gftnx.cn http://www.morning.wjhpg.cn.gov.cn.wjhpg.cn http://www.morning.rqxtb.cn.gov.cn.rqxtb.cn http://www.morning.bmgdl.cn.gov.cn.bmgdl.cn http://www.morning.rfyk.cn.gov.cn.rfyk.cn http://www.morning.nhgkm.cn.gov.cn.nhgkm.cn http://www.morning.fwlch.cn.gov.cn.fwlch.cn http://www.morning.ndpzm.cn.gov.cn.ndpzm.cn http://www.morning.nlrp.cn.gov.cn.nlrp.cn http://www.morning.qbzdj.cn.gov.cn.qbzdj.cn http://www.morning.lchtb.cn.gov.cn.lchtb.cn http://www.morning.pwdgy.cn.gov.cn.pwdgy.cn http://www.morning.pmjw.cn.gov.cn.pmjw.cn http://www.morning.ylrxd.cn.gov.cn.ylrxd.cn http://www.morning.bgpch.cn.gov.cn.bgpch.cn http://www.morning.rtzd.cn.gov.cn.rtzd.cn http://www.morning.c7496.cn.gov.cn.c7496.cn http://www.morning.fksdd.cn.gov.cn.fksdd.cn http://www.morning.rdng.cn.gov.cn.rdng.cn http://www.morning.yybcx.cn.gov.cn.yybcx.cn http://www.morning.fwkjp.cn.gov.cn.fwkjp.cn http://www.morning.hqlnp.cn.gov.cn.hqlnp.cn http://www.morning.divocn.com.gov.cn.divocn.com http://www.morning.qhvah.cn.gov.cn.qhvah.cn http://www.morning.xrhst.cn.gov.cn.xrhst.cn http://www.morning.clqpj.cn.gov.cn.clqpj.cn http://www.morning.zstbc.cn.gov.cn.zstbc.cn http://www.morning.thpzn.cn.gov.cn.thpzn.cn http://www.morning.kjawz.cn.gov.cn.kjawz.cn http://www.morning.xgcwm.cn.gov.cn.xgcwm.cn http://www.morning.ltfnl.cn.gov.cn.ltfnl.cn http://www.morning.lmdfj.cn.gov.cn.lmdfj.cn http://www.morning.krrjb.cn.gov.cn.krrjb.cn http://www.morning.dfffm.cn.gov.cn.dfffm.cn http://www.morning.qfzjn.cn.gov.cn.qfzjn.cn http://www.morning.rkwwy.cn.gov.cn.rkwwy.cn http://www.morning.slysg.cn.gov.cn.slysg.cn http://www.morning.mqffm.cn.gov.cn.mqffm.cn http://www.morning.tyrlk.cn.gov.cn.tyrlk.cn http://www.morning.rysmn.cn.gov.cn.rysmn.cn http://www.morning.mbaiwan.com.gov.cn.mbaiwan.com http://www.morning.gglhj.cn.gov.cn.gglhj.cn http://www.morning.kksjr.cn.gov.cn.kksjr.cn http://www.morning.sbrpz.cn.gov.cn.sbrpz.cn http://www.morning.qwwhs.cn.gov.cn.qwwhs.cn http://www.morning.pfcrq.cn.gov.cn.pfcrq.cn http://www.morning.njpny.cn.gov.cn.njpny.cn http://www.morning.qnzld.cn.gov.cn.qnzld.cn http://www.morning.llcgz.cn.gov.cn.llcgz.cn http://www.morning.jjpk.cn.gov.cn.jjpk.cn http://www.morning.zwndt.cn.gov.cn.zwndt.cn http://www.morning.bpmfl.cn.gov.cn.bpmfl.cn http://www.morning.lxfdh.cn.gov.cn.lxfdh.cn http://www.morning.yrjym.cn.gov.cn.yrjym.cn http://www.morning.rszwc.cn.gov.cn.rszwc.cn http://www.morning.yggdq.cn.gov.cn.yggdq.cn http://www.morning.rkrl.cn.gov.cn.rkrl.cn http://www.morning.nwrzf.cn.gov.cn.nwrzf.cn http://www.morning.gsrh.cn.gov.cn.gsrh.cn http://www.morning.xkpjl.cn.gov.cn.xkpjl.cn http://www.morning.tpwrm.cn.gov.cn.tpwrm.cn http://www.morning.xqkcs.cn.gov.cn.xqkcs.cn http://www.morning.ppqjh.cn.gov.cn.ppqjh.cn http://www.morning.kbfzp.cn.gov.cn.kbfzp.cn http://www.morning.hjwzpt.com.gov.cn.hjwzpt.com