指针的用法:
测试代码1:
cpp
#include "date.h"
#include <stdio.h>
// 函数声明,用于交换两个整数的值,通过指针传递
void swap(int *a, int *b);
int main() {
int time = getTime();
int nums[3] = {3, 1, 4}; // 定义一个包含3个整数的数组
int *p1 = &nums[0]; // 指向第一个元素的指针
int *p2 = &nums[1]; // 指向第二个元素的指针
int *p3 = &nums[2]; // 指向第三个元素的指针
// 比较并交换,以确保按从大到小排序
// 首先比较并交换 p1 和 p2 指向的值
if (*p1 < *p2) {
swap(p1, p2);
}
// 比较并交换 p1 和 p3 指向的值
if (*p1 < *p3) {
swap(p1, p3);
}
// 比较并交换 p2 和 p3 指向的值
if (*p2 < *p3) {
swap(p2, p3);
}
// 输出排序后的结果
printf("%d %d %d\n", *p1, *p2, *p3);
return 0;
}
// 定义swap函数,用于交换两个整数的值
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
运行结果如下:
测试代码2:
cpp
#include "date.h"
#include <stdio.h>
int main() {
int time = getTime();
int arr[5] = {10, 20, 30, 40, 50}; // 定义一个包含5个整数的数组
int *ptr = arr; // 定义一个指针ptr,并将其初始化为指向数组的第一个元素
// 打印初始指针指向的元素的地址和值
printf("Initial pointer position:\n");
printf("Address: %p, Value: %d\n", (void *)ptr, *ptr);
// 遍历数组,同时打印每个元素的地址和值
for (int i = 0; i < 5; i++) {
// 打印当前元素的地址和值
printf("Address: %p, Value: %d\n", (void *)(ptr + i), *(ptr + i));
// 通过ptr + i计算和打印数组中每个元素的地址和值。
// 通过指针算术访问数组中的元素,并没有改变指针的指向。
}
// 递增ptr遍历数组,并打印出每个元素的地址和值。
// 直接通过改变指针的指向遍历数组。
printf("\nMoving the pointer and printing:\n");
for (ptr = arr; ptr < arr + 5; ptr++) {
printf("Address: %p, Value: %d\n", (void *)ptr, *ptr);
}
return 0;
}
运行结果如下:
测试代码3:
cpp
#include "date.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
int main() {
int time = getTime();
int n;
printf("请输入随机数的个数:");
// 读取输入的随机数个数并存放到变量n中。
scanf("%d", &n);
// 动态分配一段内存,大小为n个整型变量大小,用于存储随机数。
int *arr = (int *)malloc(n * sizeof(int));
// 循环生成随机数并存放到arr数组中。
for (int i = 0; i < n; i++) {
arr[i] = rand() % 100; // 生成0-99之间的随机数
}
printf("打印每个元素的地址和值:\n");
// 循环遍历arr数组中的每一个元素。
for (int i = 0; i < n; i++) {
// 打印当前元素的地址和值。
printf("地址: %p, 值: %d\n", (void *)&arr[i], arr[i]);
}
printf("将地址转为二进制并打印:\n");
for (int i = 0; i < n; i++) {
// 将当前元素的地址强制转换为uintptr_t类型。
uintptr_t addr = (uintptr_t)&arr[i];
printf("地址: ");
// 循环遍历地址的每一个二进制位。
for (int j = sizeof(uintptr_t) * 8 - 1; j >= 0; j--) {
// 按位输出地址的二进制。
printf("%d", (addr >> j) & 1);
}
printf("\n");
}
// 释放动态分配的内存空间,防止内存泄漏。
free(arr);
return 0;
}
运行结果如下:
测试代码4:
cpp
#include "date.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//比较两个数的大小
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
//选择排序
void selectionSort(int *arr, int n) {
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
if (minIndex != i) {
swap(&arr[i], &arr[minIndex]);
}
}
}
int main() {
int times = getTime();
int n;
printf("Enter the number of integers to sort: ");
scanf("%d", &n);
//动态分配内存
int *arr = (int *)malloc(n * sizeof(int));
// 用当前时间作为随机数种子,每次生成不同的随机数
srand((unsigned int)time(NULL));
printf("Generated random integers:\n");
for (int i = 0; i < n; i++) {
arr[i] = rand() % 100; // 生成0到99之间的随机数
printf("%d\n", arr[i]);
}
selectionSort(arr, n);
printf("Sorted array:\n");
// 遍历数组
for (int i = 0; i < n; i++) {
printf("%d\n", arr[i]);
}
printf("Max value: %d\n", arr[n-1]);
printf("Min value: %d\n", arr[0]);
// 释放内存
free(arr);
return 0;
}
运行结果如下:
测试代码5:
cpp
#include "date.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int times = getTime();
int n, i, j;
printf("请输入n的值以定义n x n的二维数组: ");
scanf("%d", &n);
// 动态分配二维数组
int **array = (int **)malloc(n * sizeof(int *));
for (i = 0; i < n; i++) {
array[i] = (int *)malloc(n * sizeof(int));
}
// 初始化随机数种子
srand(time(NULL));
// 填充二维数组
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
array[i][j] = rand() % 100; // 生成0到99的随机数
}
}
// 使用指针遍历并打印二维数组
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
printf("Address: %p, Value: %d\n", (void *)&array[i][j], array[i][j]);
}
}
// 释放内存
for (i = 0; i < n; i++) {
free(array[i]);
}
free(array);
return 0;
}
运行结果如下: