目录
一.指针的概要
指针
一级指针
二级指针
二、一个生动形象的例子
三、总结
四、顺序表结构体中的应用
一.指针的概要
-
指针
是一种数据类型,它保存着一个变量的内存地址。指针可以通过间接引用操作符 *
来访问所指向的变量。在 C++ 中,指针通常用于动态分配内存、传递参数等场景。
-
一级指针
是直接指向一个变量的指针。一级指针只包含一个地址值,它通常用于传递参数并允许函数修改那些参数的值。使用一级指针时需要注意,指针变量必须在声明后设置为指向有效的内存位置,否则可能会导致程序崩溃或产生未定义的行为。
以下是一级指针的示例:
int a = 5;
int* p = &a; // 定义一个整型指针变量 p,它指向 a 的地址
*p = 3; // 通过指针 p 修改 a 的值
-
二级指针
二级指针是指向指针的指针,也叫做间接指针。二级指针包含两个地址值,它通常用于多级数据结构中,例如图的邻接表实现,以及某些数据结构算法等场景。
以下是二级指针的示例:
int a = 5;
int* p = &a;
int** pp = &p; // 定义一个整型指针的指针变量 pp,它指向 p 的地址
**pp = 3; // 通过指针 pp 修改 a 的值
需要注意的是,使用二级指针来访问变量时,需要使用两个 *
运算符。这是因为第一个 *
运算符表示取出指针变量中存储的地址,而第二个 *
运算符则对这个地址进行间接引用,获得指向的变量的值。
二、一个生动形象的例子
这是一个 C++ 的程序,其功能为计算某个班级同学的平均分。程序中定义了两个函数 calcAvg
和 classAvg
,以及一个 main
函数。
calcAvg
函数的作用是计算某个学生的平均分,并返回平均分值。该函数接受两个参数,第一个参数 scores
是一个指向整型数组的指针,表示这个学生的五个成绩;第二个参数 size
是一个整数,表示成绩数组的长度(即本例中固定为5)。在函数内部,使用了指针算术运算 *(scores+i)
访问成绩数组中的元素,从而计算出总分,最终返回总分除以科目数得到的平均分。
classAvg
函数的作用是计算整个班级的平均分,并通过指针返回结果。该函数接受四个参数,第一个参数 students
是一个指向字符串数组的指针,表示班级中每个学生的名字;第二个参数 scores
是一个指向整型指针数组的指针,表示班 [好像出错了,请稍后再试。]
// 计算某个学生的平均分
double calcAvg(int* scores, int size) {
double sum = 0;
for (int i = 0; i < size; i++) {
sum += *(scores + i); // 使用指针算术运算访问成绩数组的元素,计算总分
}
return sum / size; // 返回总分除以科目数得到平均分
}
// 计算整个班级的平均分
void classAvg(string* students, int** scores, int size, double* result) {
double sum = 0;
for (int i = 0; i < size; i++) {
sum += calcAvg(*(scores + i), 5); // 调用 calcAvg 函数计算每个学生的平均分,并累加到总分之中
}
*result = sum / size; // 将计算后的平均分通过指针返回
}
int main() {
// 定义学生姓名和成绩数组
string students[] = {"Alice", "Bob", "Cathy", "David", "Eva"};
int scores[][5] = {{98, 87, 93, 89, 91},
{85, 81, 76, 92, 88},
{90, 87, 82, 89, 91},
{83, 79, 77, 86, 80},
{91, 89, 94, 95, 92}};
// 定义一个指针数组,保存每个学生的成绩数组指针
int* ptrScores[] = {scores[0], scores[1], scores[2], scores[3], scores[4]};
double result; // 保存班级平均分的变量
// 调用 classAvg 函数计算班级平均分,并将结果通过指针传递回来
classAvg(students, ptrScores, 5, &result);
cout << "Class average: " << result << endl; // 输出班级平均分
return 0;
}
在上述示例中,
我们定义了一个 calcAvg
函数来计算一个学生的平均分,它接收一个指向整型数组的指针以及数组长度作为参数。
接下来,我们定义了 classAvg
函数来计算班级平均分,并通过指针返回结果。
在 classAvg
函数中,我们使用了一个二级指针 scores
来存储每个学生的成绩(即一级指针数组),并将其传递给 calcAvg
函数进行计算。最后,我们在 main
函数中调用 classAvg
函数,并通过指针返回结果。
这个例子中的二级指针 scores
通过间接引用可以获得每个学生的成绩,从而计算班级平均分。
三、总结
指针可以通过间接引用操作符 *
来访问所指向的变量。在 C++ 中,指针通常用于动态分配内存、传递参数等场景。
指针是一种数据类型,它保存着一个变量的内存地址。
一级指针是直接指向一个变量的指针,它只包含一个地址值。
二级指针是指向指针的指针,也叫做间接指针,它包含两个地址值。
一个生动的例子是,假设我们想要计算班级平均分,我们可以使用二级指针来存储每个学生的成绩,并通过间接引用获得每个学生的成绩,从而计算班级平均分。这个例子中的二级指针通过间接引用可以获得每个学生的成绩,从而计算班级平均分。
四、顺序表结构体中的应用
typedef struct ListNode
{
int val;
struct ListNode* next;
}LTNode,*PLTNode;
很多时候我们在数据结构当中看到是这个代码
这段代码定义了一个名为
ListNode
的结构体,包含val
和next
两个成员变量。其中,val
表示节点存储的值,next
表示指向下一个节点的指针。另外,通过
typedef
关键字,还定义了两个新类型:LTNode
和PLTNode
。其中,LTNode
是struct ListNode
的别名,PLTNode
则是指向struct ListNode
的指针类型。
这样定义的好处是可以简化复杂的类型声明,使得代码更加简洁易懂。在实际应用中,我们可以使用 PLTNode
来表示指向节点的指针,从而方便地进行链表操作。例如:
PLTNode head = NULL; // 链表头结点
head = (PLTNode)malloc(sizeof(LTNode)); // 动态分配内存
head->val = 1; // 节点值为 1
head->next = NULL; // 指向下一个节点的指针为 NULL
PLTNode p = (PLTNode)malloc(sizeof(LTNode));
p->val = 2; // 节点值为 2
p->next = NULL;
head->next = p; // 将新节点插入到链表中