指针进阶
课上练习
知识总结
指针进阶-知识总结
指针进阶-知识总结 数组指针 指向静态一维数组 在 C++ 中,数组名本质上是一个指向数组第一个元素的指针。因此,可以通过指针来访问数组中的元素。
1#include <iostream>
2using namespace std;
3
4int main() {
5 int arr[5] = {1, 2, 3, 4, 5}; // 定义一个包含5个整数的数组
6 int *p = arr; // 数组名是指向数组第一个元素的指针
7
8 // 通过指针访问元素
9 for (int i = 0; i < 5; ++i) {
10 cout << "*(p + " << i << ") = " << *(p + i) << endl;
11 }
12
13 return 0;
14}数组名arr是指向数组第一个元素的指针,arr等价于&arr[0]。 通过指针可以像数组一样访问数组元素, *(arr + i)等价于arr[i]。
指向动态分配一维数组 可以使用new运算符动态分配一维数组,并使用delete []运算符释放动态分配的内存。
1#include <iostream>
2using namespace std;
3
4int main() {
5 int n;
6 cout << "Enter the size of the array: ";
7 cin >> n;
8
9 // 动态分配一维数组
10 int* arr = new int[n];
11
12 // 初始化数组
13 cout << "Enter " << n << " elements:" << endl;
14 for (int i = 0; i < n; ++i) {
15 cin >> arr[i];
16 }
17
18 // 输出数组
19 cout << "The array is:" << endl;
20 for (int i = 0; i < n; ++i) {
21 cout << arr[i] << " ";
22 }
23 cout << endl;
24
25 // 释放动态分配的内存
26 delete[] arr;
27
28 return 0;
29}常数指针 常数指针和指向常量的指针是指针的两种不同使用方式,常用于保护数据不被修改。 指向常量的指针(Pointer to Constant) 指向常量的指针是一种指针,它指向一个常量数据,意味着不能通过这个指针修改指向的数据,但可以改变指针本身指向的地址。
const int *p;这里p是一个指向const int类型数据的指针。通过p不能修改指向的整数值,但是p本身可以修改指向其他地址。
1#include <iostream>
2using namespace std;
3
4int main() {
5 int a = 10;
6 int b = 20;
7 const int *p = &a; // p 指向 a,但不能通过 p 修改 a 的值
8
9 cout << "Value pointed to by p: " << *p << endl;
10
11 // *p = 15; // 错误:不能通过 p 修改 a 的值
12 p = &b; // 合法:可以改变 p 的指向
13 cout << "Value pointed to by p: " << *p << endl;
14
15 return 0;
16}常量指针(Constant Pointer) 常量指针是一种指针,它本身是一个常量,意味着指针的指向(地址)不能改变,但可以通过指针修改它所指向的数据。 int *const p; 这表示p是一个常量指针,指向int类型数据。通过p可以修改指向的整数值,但不能改变p本身的指向。
1#include <iostream>
2using namespace std;
3
4int main() {
5 int a = 10;
6 int *const p = &a; // p 是一个常量指针,指向 a
7
8 cout << "Value pointed to by p: " << *p << endl;
9
10 *p = 15; // 合法:可以通过 p 修改 a 的值
11 cout << "Value pointed to by p: " << *p << endl;
12
13 // int b = 20;
14 // p = &b; // 错误:不能改变 p 的指向
15
16 return 0;
17}指向常量的常量指针(Constant Pointer to Constant) 这种指针既是指向常量的数据,指针本身也是常量。即:不能通过指针修改数据,且指针的指向也不能改变。
const int *const p;这表示p是一个常量指针,指向const int类型数据。通过p既不能修改指向的整数值,也不能改变p本身的指向。
1#include <iostream>
2using namespace std;
3
4int main() {
5 int a = 10;
6 const int *const p = &a; // p 是一个常量指针,指向 const int
7
8 cout << "Value pointed to by p: " << *p << endl;
9
10 // *p = 15; // 错误:不能通过 p 修改 a 的值
11 // int b = 20;
12 // p = &b; // 错误:不能改变 p 的指向
13
14 return 0;
15}const总结
C++指针变量
指针类型
是否修改指向地址
是否修改指向地址的数据
int *pointer
普通指针
是
是
const int *pointer指向常量的指针
是
否
int *const pointer
常量指针
false
是
const int *const pointer指向常量的常量指针
否
否
结构体指针 可以使用指针指向一个结构体变量,并通过指针访问和修改结构体的成员。下面是一个例子,展示如何使用指向结构体的指针:
1#include <iostream>
2using namespace std;
3
4// 定义一个结构体,表示一个点
5struct Point {
6 int x; // x坐标
7 int y; // y坐标
8};
9
10int main() {
11 Point p1;
12 p1.x = 10;
13 p1.y = 20;
14
15 // 定义一个指向结构体的指针
16 Point *p_ptr;
17 p_ptr= &p1; // 将结构体变量p1的地址赋值给指针pPtr
18
19 // 通过指针访问结构体成员
20 cout << "Point p1: (" << p_ptr->x << ", " << p_ptr->y << ")" << endl;
21 cout << "Point p1: (" << (*p_ptr).x << ", " << (*p_ptr).y << ")" << endl;
22
23 // 修改结构体成员的值
24 pPtr->x = 30;
25 pPtr->y = 40;
26 cout << "Modified Point p1: (" << p1.x << ", " << p1.y << ")" << endl;
27
28 return 0;
29}可以使用指针动态分配结构体的内存。在C++中,使用new关键字动态分配内存,并使用delete关键字释放内存。下面是一个例子,展示如何动态分配和释放结构体的内存:
1#include <iostream>
2using namespace std;
3
4// 定义一个结构体,表示一个点
5struct Point {
6 int x; // x坐标
7 int y; // y坐标
8};
9
10int main() {
11 // 动态分配结构体的内存
12 Point *p_ptr= new Point;
13
14 // 设置结构体成员的值
15 p_ptr->x = 10;
16 p_ptr->y = 20;
17
18 // 通过指针访问结构体成员
19 cout << "Point: (" << p_ptr->x << ", " << p_ptr->y << ")" << endl;
20 cout << "Point p1: (" << (*p_ptr).x << ", " << (*p_ptr).y << ")" << endl;
21
22 // 释放动态分配的内存
23 delete p_ptr;
24
25 return 0;
26}️课后作业
☝️单选作业
错误的题目要弄懂,不会的千万要来问老师⚠️
✌️总结作业
总结作业非常重要,请务必认真完成✔️
- 如何使用new创建一个无名数组?
- 如何释放动态创建的无名数组的内存?
- 若函数的参数为一个指针,如何在调用函数的时候传递一个同类型的数组?
- 如何创建一个指向常量的指针?
- 如何创建一个常量指针?
- 如何创建一个结构体指针?
👌编程作业
考试只有一次提交机会,请务必本地检查正确后再提交❇️
👌编程作业标准答案
请在AC后或者思考15分钟没有进展后查看,不可抄代码❇️
L2-23.指针进阶-选择题
L2-23.指针进阶-选择题 在C++中,数组名是什么? A) 一个指向数组第一个元素的指针 B) 数组的第一个元素 C) 一个常量整数值 D) 一个特殊的引用
如果 int arr[] = {10, 20, 30};,那么表达式 *(arr + 1) 的值是多少? A) 10 B) 20 C) 30 D) arr 的地址
在C++中,如何为一个整数数组分配动态内存?
A) int* arr = new int[10];
B) int arr = new int[10];
C) int* arr = malloc(10 * sizeof(int));
D) int arr[10] = new int;如何释放动态分配的数组内存?
A) delete ptr;
B) delete[] ptr;
C) free(ptr);
D) remove[] ptr;当一个数组作为指针参数传递给函数时,函数如何获取数组的长度? A) 使用 sizeof(ptr) B) 使用 sizeof(ptr) / sizeof(ptr[0]) C) 数组长度必须作为一个额外的参数传递 D) 使用 length 方法
在C++中,new 和 new[] 操作符的主要区别是什么? A) new 用于单个对象,new[] 用于数组 B) 没有区别,它们是相同的 C) new 分配更多内存 D) new[] 用于对象,new 用于基本数据类型
一个数组定义为int a[5] = {1, 2, 3, 4, 5}; ,一个指针定义为int p = &a[2]; ,则执行p = a[1]; 后 ,数组a中的值会变为( )。 A) {1, 2, 2, 4, 5} B) {1, 3, 3, 4, 5} C) {1, 2, 3, 3, 5} D) {1, 2, 4, 4, 5}
以下哪个函数声明在调用时可以传递二维数组的名字作为参数?( )
A) void BubbleSort(int a[][4]);
B) void BubbleSort(int a[3][]);
C) void BubbleSort(int a[][]);
D) void BubbleSort(int ** a);下列关于C++语言中指针的叙述 ,不正确的是( )。 A) 可以定义指向int类型的指针 B) 可以定义指向自定义结构体类型的指针 C) 自定义结构体类型可以包含指针类型的元素 D) 不能定义指向void类型的指针
当函数接收一个数组作为参数时,实际上接收的是什么? A) 数组的副本 B) 指向数组首元素的指针 C) 数组的所有元素 D) 数组的大小
L2-23.指针进阶-选择题答案
L2-23.指针进阶-选择题答案 A 解析:在大多数情况下(除了作为sizeof操作符的操作数时),数组名会被编译器解释为指向数组第一个元素的指针。这意味着你可以使用数组名来访问数组中的元素,或者将数组名传递给期望指针参数的函数。 B 解析:*(arr + 1) 解引用到数组的第二个元素。 A 解析:使用new关键字动态分配了一个包含10个整数的数组,并将返回的指针赋值给arr。这是C++中分配动态数组的标准方法。 B 解析:delete[]用于释放动态分配的数组内存。如果ptr是一个指向动态分配的整数数组的指针,那么delete[] ptr;将正确地释放这块内存。 C 解析:由于传递的只是指向数组首元素的指针,函数无法自行确定数组的长度。 A 解析:new操作符用于动态分配单个对象,并返回指向该对象的指针。而new[]操作符用于动态分配对象数组,并返回指向数组第一个元素的指针。 A 解析:本题属于考察C++指针和数组知识。P指针指向的是a[2],将a[1]的值 赋值给p指向的变量a[2],数组中a[2]将等于a[1]。 A 解析:本题属于考察函数参数的基本概念。当把数组作为函数的一个参数时, 实际上只传递了数组的首指针。于是,传递多维数组时,只有形式参数的第一维 的长度可以省略,形式参数的其他维的长度都不能省略。所以本题正确答案为 A。 D 解析:本题属于考察计算机指针知识。可以指向void类型 B 解析:当数组名作为函数参数时,它会被解释为指向数组首元素的指针。这意味着函数可以通过这个指针访问数组中的元素。
L2233题解+参考代码
L2233题解+参考代码 题目链接 删除数组的最小数:L2233
题解 我们需要编写一个函数 remove_min 来删除整型数组中的最小数,并输出删除最小数后的数组。这个函数接收一个指向数组的指针和数组长度的指针作为参数,并在原数组上进行操作。
算法步骤 读取输入:从标准输入读取数组和数组长度。 定义函数 remove_min: 遍历数组找到最小值及其索引。 将数组中最小值后的所有元素向前移动一位。 减少数组长度。 输出结果:输出删除最小值后的数组。
示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4void remove_min(int *arr, int *n) {
5 if (*n == 0) return;
6
7 // 找到最小值及其索引
8 int min_index = 0;
9 for (int i = 1; i < *n; ++i) {
10 if (arr[i] < arr[min_index]) {
11 min_index = i;
12 }
13 }
14
15 // 将最小值后的所有元素向前移动一位
16 for (int i = min_index; i < *n - 1; ++i) {
17 arr[i] = arr[i + 1];
18 }
19
20 // 减少数组长度
21 (*n)--;
22}
23
24int main() {
25 int n;
26 cin >> n;
27 int arr[100];
28 for (int i = 0; i < n; ++i) {
29 cin >> arr[i];
30 }
31
32 remove_min(arr, &n);
33
34 for (int i = 0; i < n; ++i) {
35 if (i > 0) cout << " ";
36 cout << arr[i];
37 }
38 cout << endl;
39
40 return 0;
41}L2234题解+参考代码
L2234题解+参考代码 题目链接 字符串长度:L2234
题解 我们需要编写一个函数 len_string 来计算输入字符串的长度。该函数接收一个指向字符数组的指针,并返回字符数组的长度。
算法步骤 读取输入:从标准输入读取字符串。 定义函数 len_string: 使用指针遍历字符串,直到遇到终止符 \0。 计算遍历的字符数,即为字符串长度。 输出结果:输出字符串的长度。 示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4// 定义函数 len_string,用于计算字符串长度
5int len_string(const char* str) {
6 int length = 0;
7 while (str[length] != '\0') {
8 length++;
9 }
10 return length;
11}
12
13int main() {
14 char str[101];
15 cin >> str;
16
17 int length = len_string(str);
18
19 cout << length << endl;
20
21 return 0;
22}