C语言基础(十二)

指针的用法:

测试代码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;  
}

运行结果如下:

相关推荐
蒸蒸yyyyzwd14 分钟前
从面经中学到的三件事
c++·笔记
时时三省21 分钟前
【时时三省】计算机c语言二级考试选择题重点
c++
罗西的思考24 分钟前
[Agent Memory / 强化学习] MemPO源码学习笔记 --- (2)--- 训练
人工智能·算法·机器学习
深圳市方中禾科技2 小时前
FZH1625 LCD 驱动芯片深度评测与实战指南
算法·led
我不会起名字3222 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
云泽8083 小时前
STM32 USART 详解(八):C I/O 串口重定向原理与实现
c语言·stm32·嵌入式硬件
ThornArmor3 小时前
重铸1996|肉体渲染:关节的裂缝:分段模型积木拼装与未成熟的 RSP 矩阵骨骼动画形变
c语言·汇编·c++·python·硬件架构·游戏机
T1mzhou3 小时前
ARM64 Linux 6.10 内核驱动(12):dd.c:probe/ remove、延迟 probe
linux·服务器·c语言·arm开发·arm
huang5791474 小时前
哈希算法的抗碰撞机制与安全性增强策略4
算法
林浩杨_4 小时前
SIGIR 2026|南京大学:Video-GAR:“通过生成 Query 来验证视频语义理解”的生成增强范式
论文阅读·人工智能·算法