指针运算与保险箱密码探索

需积分: 0 0 下载量 144 浏览量 更新于2024-07-11 收藏 731KB PPT 举报
在第8章“指针”中,主要讨论了赋值运算与指针在C/C++编程中的核心概念。章节以一个特工008寻找保险箱密码的情景引入,强调了变量、内存单元和地址之间的关系。指针是计算机科学中的重要概念,它是一种特殊的变量类型,存储的是内存中的地址而不是数据本身。 首先,理解指针的关键在于其作用:它允许程序操作内存地址,而非直接操作存储在内存中的数据。在C语言中,定义指针变量如`int *p1, *p2;`,通过`p1 = &a;`将整型变量`a`的地址赋值给指针`p1`,这样`p1`就成为了一个指向`a`的指针。同样地,`p2 = p1;`使`p2`也指向`a`,表示两个指针指向同一内存位置。 指针的初始化通常是将其设置为NULL或者一个已经存在的变量地址。例如,`int* addr = NULL; addr = &key;`展示了如何初始化指针并赋值。指针的基本运算包括算术运算(如指针加减)和比较运算,但主要的操作是通过解引用操作符`*`来访问指针所指向的变量值,如`printf("If I know the address of the key, I also can get it: %d\n", *addr);`。 指针在函数中的运用十分广泛,它们可以作为参数传递,使得函数能够修改调用者提供的变量值,甚至返回多个值。例如,函数可以接收一个指针作为参数,并通过指针改变外部变量的值。此外,动态内存分配也是指针的一个重要应用,程序员可以通过`malloc()`等函数在运行时根据需要动态创建和释放内存空间。 8.1小节的“寻找保险箱密码”示例展示了如何通过指针间接访问和操作变量。通过定义`int key = 911`和`int* addr = &key`,程序展示了两种获取密码的方式:一是直接通过变量`key`输出,二是通过`*addr`间接访问并输出地址对应的值。 总结来说,第8章“指针”讲解了指针的定义、初始化、基本运算、在函数中的使用以及动态内存管理,这些都是C/C++程序员必备的基础技能,对于理解和处理复杂的数据结构和算法至关重要。理解指针的概念有助于优化代码的性能,提高程序的灵活性和可维护性。

S0 SEGMENT STACK DW 20 DUP(?) TOP LABEL WORD S0 ENDS S1 SEGMENT TIP DB "Please enter ten numbers separated by spaces:", 0DH, 0AH, 24H ARY DW 20 DUP(0) CRLF DB 0DH, 0AH, 24H N DW 0 S1 ENDS S2 SEGMENT ASSUME SS:S0, DS:S1, CS:S2, ES:S1 P PROC FAR MOV AX, S0 MOV SS, AX LEA SP, TOP MOV AX, S1 MOV DS, AX MOV AX, S1 MOV ES, AX LEA DX, TIP MOV AH, 9 INT 21H LEA SI, ARY XOR DX, DX MOV BL, 10 MOV CX, 10 INPUT: MOV AH, 1 INT 21H CMP AL, 20H ;空格分隔字符 JE SAVE;输入十进制数,将数存入SI对应的内存单元 MOV DL, AL MOV AX, [SI] MUL BL SUB DL, 30H ADD AL, DL MOV [SI], AX JMP INPUT SAVE: ADD SI, 2 LOOP INPUT;数组保存完毕 LEA SI, ARY MOV DI, SI ADD DI, 2 ;DI位于数组的第二元素的位置 MOV BP, 9 ;SI移动的次数和每一次比较的次数,第一次为9 GO: MOV CX, BP ;每一次比较的循环次数 MOV BX, [SI] ;第一个数 CMPA: CMP BX, [DI] ;比较后面的数是否比当前的小 JBE CON ;大于就比较下一个 MOV BX, [DI] ;将寄存器中的值替换为最小的值 MOV AX, DI ;AX存放最小值的偏移地址 CON: ADD DI, 2 LOOP CMPA CMP AX, 0 ;如果AX为0,则表示后面的值没有比当前值小 JE NO ;此时SI加一,移动到第二个数 下一次循环比较开始 CHANGE: MOV DX, [SI] ;78-83行替换当前值与最小值 PUSH DX MOV [SI], BX POP DX MOV DI, AX MOV [DI], DX NO: ADD SI, 2 MOV DI, SI ADD DI, 2 CALL PRINT DEC BP ;循环的次数减一 XOR AX, AX ;清除AX的内容,以便76行判断 CMP BP, 1 JNE GO EXIT: MOV AH, 4CH INT 21H P ENDP PRINT PROC NEAR PUSH SI PUSH CX PUSH AX PUSH DX LEA DX, CRLF MOV AH, 9 INT 21H LEA SI, ARY MOV CX, 10 L1: MOV AX, [SI] MOV N, AX CALL OUTPUT ADD SI, 2 MOV DX, 20H MOV AH, 2 INT 21H LOOP L1 POP DX POP AX POP CX POP SI RET PRINT ENDP OUTPUT PROC NEAR PUSH AX PUSH BX PUSH CX PUSH DX XOR CX, CX MOV AX, N MOV BX, 10 L2: XOR DX, DX DIV BX PUSH DX INC CX CMP AX, 0 JNE L2 L3: POP DX ADD DX, 30H MOV AH, 2 INT 21H LOOP L3 POP DX POP CX POP BX POP AX RET OUTPUT ENDP S2 ENDS END P一共123行每行都是干什么的

2023-05-17 上传