资源预览内容
第1页 / 共22页
第2页 / 共22页
第3页 / 共22页
第4页 / 共22页
第5页 / 共22页
第6页 / 共22页
第7页 / 共22页
第8页 / 共22页
第9页 / 共22页
第10页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1,计算的本质,从根本上说,计算就是执行CPU指令。 实现自动计算,就一定要保存程序(内存),2,CPU对内存的操作,Von Neumann,CPU,Memory,Address,Data,Read / Write control,8bit,1Byte = 8bit,0012FF87,0012FF81,0012FF7F,0012FF7D,0012FF7C,0012FF80,0012FF7E,3,内存的内容,内存中存放的是可执行文件(.exe)。 .exe与.c等效。 .exe是.c中的代码转换成了指令与数据(机器码)。 每个内存单元中,存放了指令或者数据。,4,对内存的访问,用变量对应某段内存,可避免直接使用内存地址 内存的2个方面:地址+内容 通过变量(符号)对内存内容进行读/写,0012FF7C,5,0012FF78,5,int x = 5; int y = x;,5,符号表,exe文件中,根据obj的符号表把标识符变成地址。(obj中的符号表记录的是相对地址-从0开始),0012FF7C,0012FF7D,0012FF7F,0012FF81,0012FF7E,0012FF80,0012FF82,0012FF83,100,int a = 100; void fun() ,100,变量值,变量名,0012FF7C,6,在代码中取地址 & (取址=取地址值 ),地址值是常量(变量的地址,是只读的) 不能对地址值取地址(区分地址和地址值) 只能对变量取址(&右边是符号标识符) 地址有类型,地址值是字面值。地址可以取内容。 技巧:在编程时你可以忘记符号表,而把内存内容等同于变量,内存地址等同&变量。,int a = 100; printf(“%pn“,0012FF7C,100,7,在代码中取内容*(取内存的内容),int a = 100; int b = *(,0012FF7C,100,0012FF78,100,8,在代码中取内容*(取内存的内容),只能对地址取内容(*右边是地址,地址=指针),不能对非指针变量取内容。 对于指针变量,取内容即指针所保存地址的内容,该内容可以读写。 *与&是互逆的操作 *与&的不同 &由变量声明决定(不读写内存) *根据地址读取内存,9,操作与求值,操作符(* & - + % =等等)通过类型进行操作,可以认为,操作是类型的行为。 在操作之前,都会对操作对象求值(表达式求值)。 操作对应计算机指令,操作对象对应数据。 优先级 () . -,+ -, * &, =,int a = 100; int b = a + 1; int *p = ,10,偏移地址取内容 ,取内容,可读写。 左边是地址。 (*右边是地址) 是一种危险操作,它不做越界检查。,int a = 10; int b = 8; int c = 3; printf(“(,读写内存,int a = 56; int *p = ,11,12,地址变量指针(图示),0012FF78 = &p,p = 0012FF7C,a = 100,0012FF7C = &a,00,00,00,64,00,12,FF,7C,int a = 100; int *p = /操作,0012FF78,0012FF7C,指向指针的指针,13,13,0012FF78 = &p,p = 0012FF7C,a = 100,0012FF7C = &a,int a = 100; int *p = ,0012FF74 = &q,q = 0012FF78,14,地址变量指针,地址变量也是变量,普通变量通常存储字面值,地址变量存储地址值。 指针就是地址,指针(变量)存储地址值。 指针的大小固定=机器字长。 指针变量的偏移:pi, p+, p-, p+i, p-i,int a = 100; int *p = ,15,引用 C+,定义引用时,必须同时对其进行初始化。 引用是通过指针实现的。 引用也占用地址空间 引用是被引用变量的别名(看起来像),int a = 100; int /操作,16,数组,数组名称指代数组,其值为其地址值。(类似变量:&a) 数组名称是数组的首地址;即第一个元素的地址。 (类似指针a2),它是地址常量。 数组:一组地址连续且数据类型相同的元素构成的集合,int a3 = 7,3,5; printf(“a1=%dn ,使用数组名称,2019/9/11,17,int a3 = 1, 2, 3; int *p = a; int (*q)3 = / 88, 101, 3,for循环,常用于数组(或有序容器)元素的遍历 for:三部分(初始化,循环条件,步长变化),18,int sum = 0; int a3 = 1, 2, 3; int i; for (i = 0; i 3; i+) sum = sum + ai; ,19,& * 总结,优先级: , +, * &,20,字符串,C没有字符串的类型;字符串是一个带结尾标记的字符数组。 char ch6 =c,h,i,n,a,0; char ch = “china“; char ch = “china“; char* ch = “china“;,21,字符串的拷贝,char* ch = “china“; char str10; strcpy(str, ch); strcpy(str, “china“);,22,思考,程序是如何运行的? 程序所需的容量比机器内存还要大,该怎么办? 每个机器的内存大小不尽相同,如何确定同一程序在不同机器上的地址? 你认为程序的符号表该如何组织的? 指针变量的偏移pi与p+i之间有什么联系? 引用不占内存空间吗? 你能确定下面的组合定义吗?如:int * c3; int (*p); int c34;,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号