
指针是C/C++中强大的工具,理解其使用场景对编程至关重要。以下是一些具体建议,帮助你掌握指针的使用时机和练习方法:
1. 动态内存分配
- 场景: 当数据量在运行时才确定时,使用指针动态分配内存。
- 练习: 编写程序,动态创建数组并操作。例如,输入学生数量后,动态分配数组存储成绩并计算平均分。
/*-----------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int n;
printf("Enter the number of students: ");
scanf("%d", &n);
int *grades = (int *)malloc(n * sizeof(int));
if (grades == NULL)
{
printf("Memory allocation failed\n");
return 1;
}
for (i = 0; i < n; i++)
{
printf("Enter grade for student %d: ", i + 1);
scanf("%d", &grades[i]);
}
int sum = 0;
for (i = 0; i < n; i++)
{
sum += grades[i];
}
printf("Average grade: %.2f\n", (float)sum / n);
free(grades);
return 0;
}
/*-----------------------------------------------------------------------*/
运行结果:

2. 函数参数传递
- 场景: 当需要在函数内修改实参时,传递指针。
- 练习: 编写函数交换两个整数。
/*-----------------------------------------------------------------------*/
#include <stdio.h>
void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int x = 5, y = 10;
printf("Before swap: x = %d, y = %d\n", x, y);
swap(&x, &y);
printf("After swap: x = %d, y = %d\n", x, y);
return 0;
}
/*-----------------------------------------------------------------------*/
运行结果:

3. 数组和字符串操作
- 场景: 使用指针遍历数组或字符串。
- 练习: 编写函数计算字符串长度。
/*-----------------------------------------------------------------------*/
#include <stdio.h>
int string_length(char *str)
{
int length = 0;
while (*str != '\0')
{
length++;
str++;
}
return length;
}
int main()
{
char str[] = "Hello, World!";
printf("Length of the string: %d\n", string_length(str));
return 0;
}
/*-----------------------------------------------------------------------*/
运行结果:
4. 数据结构
- 场景: 实现链表、树等数据结构时,指针用于节点连接。
- 练习: 实现简单单链表并插入、删除节点。
/*-----------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int data;
struct Node *next;
};
void insert(struct Node **head, int data)
{
struct Node *new_node = (struct Node *)malloc(sizeof(struct Node));
new_node->data = data;
new_node->next = *head;
*head = new_node;
}
void print_list(struct Node *head)
{
struct Node *current = head;
while (current != NULL)
{
printf("%d -> ", current->data);
current = current->next;
}
printf("NULL\n");
}
int main()
{
struct Node *head = NULL;
insert(&head, 10);
insert(&head, 20);
insert(&head, 30);
print_list(head);
return 0;
}
/*-----------------------------------------------------------------------*/
运行结果:
5. 函数指针
- 场景: 使用函数指针实现回调或动态调用。
- 练习: 编写程序,使用函数指针调用不同函数。
/*-----------------------------------------------------------------------*/
#include <stdio.h>
void add(int a, int b)
{
printf("Sum: %d\n", a + b);
}
void subtract(int a, int b)
{
printf("Difference: %d\n", a - b);
}
int main()
{
void(*operation)(int, int);
operation = add;
operation(10, 5);
operation = subtract;
operation(10, 5);
return 0;
}
/*-----------------------------------------------------------------------*/
运行结果:

6. 多级指针
- 场景: 处理指针的指针,如动态二维数组或修改指针本身。
- 练习: 动态创建二维数组并操作。
/*-----------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i = 0;
int j = 0;
int rows = 3, cols = 4;
int **arr = (int **)malloc(rows * sizeof(int *));
for (i = 0; i < rows; i++)
{
arr[i] = (int *)malloc(cols * sizeof(int));
}
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
arr[i][j] = i + j;
}
}
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
for (i = 0; i < rows; i++)
{
free(arr[i]);
}
free(arr);
return 0;
}
/*-----------------------------------------------------------------------*/
运行结果:

7. 指针与结构体
- 场景: 使用指针访问和修改结构体成员。
- 练习: 创建结构体数组并按某个成员排序。
/*-----------------------------------------------------------------------*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student
{
char name[50];
int age;
};
void sort_students(struct Student *students, int n)
{
int i = 0;
int j = 0;
for (i = 0; i < n - 1; i++)
{
for (j = 0; j < n - i - 1; j++)
{
if (students[j].age > students[j + 1].age)
{
struct Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
}
int main()
{
int i = 0;
struct Student students[] =
{
{ "Alice", 22 },
{ "Bob", 19 },
{ "Charlie", 21 }
};
int n = sizeof(students) / sizeof(students[0]);
sort_students(students, n);
for (i = 0; i < n; i++)
{
printf("%s: %d\n", students[i].name, students[i].age);
}
return 0;
}
/*-----------------------------------------------------------------------*/
运行结果:


被折叠的 条评论
为什么被折叠?



