» C语言快速入门 » 1. 基础篇 » 1.5 指针

指针

指针是一个可以保存另一个变量地址的变量。

int* a; // `a` 是指向 int 类型的指针
double *ptrPi; // `ptrPi` 是指向 double 类型的指针

地址解析

地址运算符 & 用于获取变量的内存地址。

#include <stdio.h>

int main() {
    // 声明变量
    int number = 42;
    double pi = 3.14159;
    char letter = 'A';

    // 显示变量的地址
    printf("Address of number: %p\n", &number);
    printf("Address of pi: %p\n", &pi);
    printf("Address of letter: %p\n", &letter);

    return 0;
}

%p 格式标示符用于在 printf 中打印内存地址。

解引用

解引用运算符 * 用于访问指针指向的特定内存地址处存储的值。

例如:


int main() {
    int number = 42;
    double pi = 3.14159;
    char letter = 'A';

    int *ptrNumber = &number;
    double *ptrPi = &pi;
    char *ptrLetter = &letter;

    printf("Value of number: %d\n", *ptrNumber);
    printf("Value of pi: %.5f\n", *ptrPi);
    printf("Value of letter: %c\n", *ptrLetter);

    return 0;
}

解引用运算符允许操作指针指向的内存位置处的值。在 C 中使用指针操作非常重要。

指针算术

当对进行指针算术运算时,编译器会根据指针指向的数据类型的大小计算结果地址。

#include <stdio.h>

int main() {
    int numbers[] = {10, 20, 30, 40, 50};

    int *ptr = numbers;

    printf("Elements of the array using pointer arithmetic:\n");
    for (int i = 0; i < 5; ++i) {
        printf("Element %d: %d\n", i + 1, *(ptr + i));
    }

    int *thirdElementPtr = ptr + 2;
    printf("\nAccessing the third element directly using pointer arithmetic: %d\n", *thirdElementPtr);

    return 0;
}

堆内存分配

在 C 中进行堆分配需要使用诸如 malloccallocrealloc 等函数从堆中动态分配内存,并返回结果指针。

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 为整数动态分配内存并返回其地址的指针
    int* a = (int*)malloc(sizeof(int));
    if (a) { // 检查内存是否成功分配
        free(a); // 手动释放它,否则会导致内存泄漏
    }
    return 0;
}

代码挑战

编写一个 C 程序,使用指针交换两个整数的值。

Loading...
> 此处输出代码运行结果
上页
下页