指针基础
课上练习
知识总结
指针-知识总结
指针基础-知识总结 指针概念 指针是一种特殊的变量,只能用来存储内存的地址,使用*号表示其是一个指针。
指针定义 定义指针时需要指明指针指向内存所存储的数据类型及指针名称。示例: int ptri; // 指针指向地址只能存储int类型数据 doube ptrd; // 指针指向地址只能存储double类型数据 char ptrc; // 指针指向地址只能存储char类型数据 bool ptrb; // 指针指向地址只能存储bool类型数据
指针赋值 赋值为空
int *ptr = nullptr;赋值为一个已存在变量的内存地址
int number = 5;
int *ptr = &number;赋值为动态开辟的内存地址
int *ptr = new int;指针的适用 使用指针内的地址 使用指针中存储的地址,直接输出指针即可。
int number = 5;
int *ptr = &number;
cout << ptr << endl; // 输出number变量的地址使用指针内地址上的数据 使用指针中存储的地址中保存的数据,需要使用指针解引用的方式,即在指针名字之前加一个*号。
int number = 5;
int *ptr = &number;
cout << *ptr << endl; // 输出number变量内存储的数据,即5使用指针变量自己的地址 使用指针变量自己的地址的时候,需要使用引用符号,即在指针的名字前面加上一个&符号。
int number = 5;
int *ptr = &number;
cout << &ptr << endl; // 输出ptr变量的地址按指针传参 按指针传递是指将实际参数的地址传递给函数参数,通过指针操作可以修改实际参数。
优点: 可以通过传递指针实现类似按引用传递的效果。 适合需要传递可变长数组或动态分配内存的情况。 缺点: 需要处理指针的合法性和内存管理问题,容易引发内存泄漏或非法访问。 语法相对复杂,容易出错。
按指针传参代码示例:
1void foo(int *x) {
2 *x = 20;
3}
4
5int main() {
6 int a = 10;
7 foo(&a);
8 // a的值被修改为20
9 return 0;
10}动态内存 动态内存是指在程序运行时所使用的内存,使用new的方式开辟,使用delete的方式释放。
int *ptr = new int(3);
*ptr = 5;delete ptr;
ptr = nullptr;动态内存使用注意事项: 使用过后一定需要使用delete进行释放 若释放了一个指针指向的动态内存,一定要对其进行赋值,否则指针就会变成野指针/悬挂指针。
使用动态内存的优点: 可以灵活分配内存 节省内存空间 可以用来实现并处理复杂的大兴数据结构 可以用来增加程序的可扩展性 可以支持多线程编程
️课后作业
☝️单选作业
错误的题目要弄懂,不会的千万要来问老师⚠️
✌️总结作业
总结作业非常重要,请务必认真完成✔️
- 如何把一个指针初始化为指向空?
- 如何把一个指针初始化为一个已存在内存的地址?
- 如何把一个指针初始化为一块动态开辟的内存的地址?
- 如何获取指针变量的地址?
- 如何获取指针变量里存储的地址?
- 如何获取指针变量里存储的地址上的数据?
👌编程作业
考试只有一次提交机会,请务必本地检查正确后再提交❇️
👌编程作业标准答案
请在AC后或者思考15分钟没有进展后查看,不可抄代码❇️
L2-22.指针基础-选择题
L2-22.指针基础-选择题 在C++语言中 ,指针变量在逻辑上指向另一个变量在内存中的位置 ,指针变量本身不占用内存。 A) 正确 B) 错误
如何声明一个指向整数的指针?
A) int *ptr;
B) int ptr;
C) *int ptr;
D) ptr int*;以下哪种说法是错误的? A) 指针可以指向任何类型的数据 B) 指针可以进行算术运算 C) 所有指针的大小都相同 D) 指针可以直接存储实际值
如何使用指针访问变量的值? A) 通过指针名称 B) 使用 & 运算符 C) 使用 * 运算符 D) 使用 -> 运算符
如果 ptr 是一个指向整数的指针,表达式 *ptr = 5; 会做什么? A) 将 ptr 的值设置为5 B) 将 ptr 指向数字5 C) 将 ptr 指向的变量的值设置为5 D) 产生一个错误
在C++中,如何为一个整数分配动态内存?
A) int* ptr = new int;
B) int* ptr = malloc(sizeof(int));
C) int ptr = new int;
D) int* ptr = alloc int;当使用 new 关键字分配了内存后,如何释放这块内存?
A) free(ptr);
B) delete ptr;
C) dealloc ptr;
D) remove ptr;如果忘记释放使用 new 分配的内存,可能会发生什么? A) 内存泄露 B) 程序崩溃 C) 编译错误 D) 自动释放
如果 ptr 是一个有效的指针,delete ptr; 之后 ptr 是什么? A) nullptr B) 依然指向原来的地址 C) 未定义 D) 一个新的指针地址
如果n为int类型的变量,一个指针变量定义为int *p=&n; ,则下列说法正确的 是( )。 A) 指针变量p的值与变量n是相同 B) 指针变量p的值与变量n的地址是相同的 C) 指针变量p指向的值为 'n' D) 指针变量p指向的值与变量n的地址是相同的
L2-22.指针基础-选择题答案
L2-22.指针基础-选择题答案 B 解析:本题是C++指针类型的知识,指针是个变量,占用内存。 A 解析:声明了一个名为ptr的指针,该指针指向一个整数(int)。 D 解析:指针不存储数据值本身,它们存储的是数据的内存地址,所以指针的大小都是相同的。 C 解析:*运算符被称为解引用运算符,用于通过指针访问它所指向的变量的值。 C 解析:这个表达式通过指针修改它指向的内存位置的值。 A 解析:使用 new 关键字可以为整数分配动态内存,并返回指向该内存的指针。 B 解析:如果ptr是通过new[]分配的数组,那么应该使用delete[] ptr;来释放内存。 A 解析:忘记释放内存会导致内存泄露,即分配的内存在不再需要时没有被回收,长时间运行的程序可能因此耗尽内存资源。 C 解析:删除一个指针后,指针本身的值变为未定义,它可能仍然指向原来的地址,但该地址已不再有效。 B 解析:本题属于考察C++指针知识。指针的值保存的是变量的地址,所以选B。
L2223题解+参考代码
L2223题解+参考代码 题目链接 指针赋值练习2:L2223
题解 按照题目要求的操作顺序完成
算法步骤 按照题目要求的操作顺序完成
示例代码 这里是使用 C++ 实现的示例代码:
1#include <iostream>
2using namespace std;
3
4int main() {
5 // 创建整型变量 a 并读取输入
6 int a;
7 cin >> a;
8
9 // 创建整型指针 ptr1,并使用 new 分配内存并存储 a + 5
10 int *ptr1 = new int;
11 *ptr1 = a + 5;
12
13 // 创建整型指针 ptr2,并使用 new 分配内存并存储 a - 5
14 int *ptr2 = new int;
15 *ptr2 = a - 5;
16
17 // 输出 ptr1 指向的内存的值 * ptr2 指向的内存的值的乘积
18 cout << (*ptr1) * (*ptr2) << endl;
19
20 // 释放 ptr1 和 ptr2 指向的内存
21 delete ptr1;
22 delete ptr2;
23
24 return 0;
25}L2224题解+参考代码
L2224题解+参考代码 题目链接 加密的病历单:L2224
题解 本题需要对输入的加密字符串进行解密。解密步骤如下: 大小写反转:将字符串中的每个大写字母变为小写字母,反之亦然。 逆序存储:将字符串中的字符顺序逆序。 字符循环右移3位:将字符串中的每个字母在字母表中右移三位。 我们通过定义一个函数 decrypt_str 来执行上述步骤,并在 main 函数中调用该函数处理输入的字符串。
算法步骤 读取输入:从标准输入读取加密的字符串。 大小写反转:遍历字符串,对每个字符进行大小写转换。 逆序存储:使用 reverse 函数对字符串进行逆序。 字符循环右移3位:遍历字符串,对每个字母进行循环右移3位。 输出结果:输出解密后的字符串。
示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4void decrypt_str(string* s) {
5 int len = s->length();
6
7 // 大小写反转
8 for (int i = 0; i < len; ++i) {
9 if (isupper((*s)[i])) {
10 (*s)[i] = tolower((*s)[i]);
11 } else if (islower((*s)[i])) {
12 (*s)[i] = toupper((*s)[i]);
13 }
14 }
15
16 // 逆序存储
17 reverse(s->begin(), s->end());
18
19 // 字符循环右移3位
20 for (int i = 0; i < len; ++i) {
21 if (isupper((*s)[i])) {
22 (*s)[i] = ((*s)[i] - 'A' + 3) % 26 + 'A';
23 } else if (islower((*s)[i])) {
24 (*s)[i] = ((*s)[i] - 'a' + 3) % 26 + 'a';
25 }
26 }
27}
28
29int main() {
30 string s;
31 cin >> s;
32
33 decrypt_str(&s);
34
35 cout << s << endl;
36
37 return 0;
38}