9.1 指针和数组的内存分配电子课件 计算机系统基础:C语言视角(RISC-V版).ppt
9.1指针和数组的内存分配电子课件计算机系统基础:C语言视角(RISC-V版)指针指针和数组的内存分配和数组的内存分配声明声明指针变量指针变量声明声明type*pointer_name;type*pointer_name;变量名:变量名:pointer_namepointer_nametypetype:指针所指的数据的类型:指针所指的数据的类型指针变量包含了一个存储对象的地址,比如一个变量的指针变量包含了一个存储对象的地址,比如一个变量的地址地址指针运算符指针运算符取取地址运算符地址运算符“&”“&”间接运算符间接运算符“*”“*”取取地址运算符地址运算符“&”生成操作数的存储地址生成操作数的存储地址intobject;int*ptr;object=4;ptr=&object;寄存器和内存的分配寄存器和内存的分配假设假设objectobject和和ptrptr都是局部变量,都是局部变量,ptrptr分配给寄分配给寄存器存器s1s1,objectobject必须被分配到栈帧中必须被分配到栈帧中intobject;int*ptr;object=4;ptr=&object;赋值语句赋值语句lilit0,4t0,4#x5=4#x5=4swswt0,0(sp)t0,0(sp)#object=4;#object=4;mvmvs1,sps1,sp#ptr=&object;#ptr=&object;intobject;int*ptr;object=4;ptr=&object;间接运算符间接运算符解解引用引用运算符运算符“*”间接操作存储对象里的值间接操作存储对象里的值type*pointer_name;type*pointer_name;*pointer_name*pointer_name,被,被指针变量指针变量pointer_namepointer_name所所指的值指的值intobject;int*ptr;object=4;ptr=&object;*ptr=*ptr+1;*ptr*ptrint object;int object;int*ptr;int*ptr;object=4;object=4;ptr=&object;ptr=&object;*ptr=*ptr+1;*ptr=*ptr+1;lwlwt0,0(t0,0(s1s1)#t0-*ptr#t0-*ptraddiaddit0,t0,1t0,t0,1#*ptr+1#*ptr+1swswt0,0(t0,0(s1s1)#*ptr=*ptr+1;#*ptr=*ptr+1;*ptr*ptr赋值运算符的右边赋值运算符的右边出现在单元中的值出现在单元中的值赋值运算符的左边赋值运算符的左边要作修改的单元要作修改的单元*ptr*ptr 与与 objectobjectint object;int object;int*ptr;int*ptr;object=4;object=4;ptr=&object;ptr=&object;/*ptr=*ptr+1;/*ptr=*ptr+1;object=*ptr+1;object=*ptr+1;fpfpobject:object:4 45 5s1s1raraspspfpfp.lwlwt0,0(s1)t0,0(s1)#t0-*ptr#t0-*ptraddiaddit0,t0,1t0,t0,1#*ptr+1#*ptr+1swswt0,0(t0,0(spsp)#object=*ptr+1;#object=*ptr+1;数组数组在在内存内存中中连续排列连续排列的一列数据的一列数据字符序列字符序列,字符数组字符数组数组数组在内存中的分配在内存中的分配示例:示例:int x10;int x10;访问数组的访问数组的元素元素使用下标使用下标/索引访问这个数组中的某个特定的索引访问这个数组中的某个特定的元素元素下标:从这个数组第一个元素开始的偏移量下标:从这个数组第一个元素开始的偏移量例如:例如:x5=x0+1;x5=x0+1;示例示例x5=x0+1;x5=x0+1;addit0,sp,0#t0-数组的基址数组的基址lwt1,0(t0)#t1-x0 addit1,t1,1#t1-x0+1swt1,20(t0)#x5=x0+1;基址基址+偏移量偏移量数组的下标可以是任意的合法的数组的下标可以是任意的合法的C C语言整数表语言整数表达式达式xi+5=xi+1;xi+5=xi+1;/假设假设i i被分配给被分配给s1s1addit0,sp,0#t0-数组的基址数组的基址 sllit1,s1,2#t1-i*4addt1,t0,t1#计算计算xi的地址的地址 lwt2,0(t1)#t2-xi addit2,t2,1#t2-xi+1 addit1,s1,5#t1-i+5 sllit1,t1,2#t1-(i+5)*4addt1,t0,t1#计算计算xi+5的地址的地址 swt2,0(t1)#xi+5=xi+1;数组与指针之间的关系数组与指针之间的关系数组的名字数组的名字:数组的基址数组的基址int x10;int x10;int*ptr;int*ptr;ptr=x;ptr=x;x:x:等价于等价于&x0 x5 x5 或或 *(ptr+5)(ptr+5):访问同一元素:访问同一元素#假设假设ptrptr被分配给被分配给s1s1addiaddit0,sp,0 t0,sp,0#t0-#t0-数组的基址数组的基址mvmvs1,t0s1,t0#ptr=x;#ptr=x;区别区别ptrptr:变:变量,可以被重新赋值量,可以被重新赋值数组数组名名x x:不能被重新赋值不能被重新赋值x=ptr+;/x=ptr+;/非法!非法!intx10;int*ptr;ptr=x;