学习了指针,认为自己有了些许理解,但是不知道什么时候或者什么习题中才能使用指针?


        指针是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;
}
/*-----------------------------------------------------------------------*/

运行结果:

通过这些练习,你将逐步掌握指针的使用场景和技巧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值