指针

  • 指针变量保存的是一个十六进制的内存地址编号,通过这个地址我们可以直接操作这个内存
  • 声明一个指针:int* pointer;
//声明一个指针
int* pointer;
//声明一个变量a
int a = 1;
//给指针赋值
pointer = &a;
//指针解引用赋值
*pointer = 3;

数组和指针操作

包含头文件

#include <stdio.h>

数组的地址

打印数组的地址、数组指针指向的地址和数组第一个元素的地址。

    int array[4];
    // 数组变量指向存储空间的首地址
    printf("数组的地址:%p\n", (void *)&array);
    printf("数组指针指向的地址:%p\n", (void *)array);
    printf("数组第一个元素的地址:%p\n", (void *)&array[0]);

对指针进行加减操作

通过指针操作输入数组元素,并打印数组元素。

    // 对指针进行加减操作,使指针指向上一个或下一个存储单元,存储单元的大小由数据类型决定,例如 char 是 1 byte, int 是 4 byte
    for (int i = 0; i < 4; i++) {
        printf("请输入第%d个数:\n", i + 1);
        // 两种等价的写法
        scanf("%d", &array[i]);
        // scanf("%d", array + i); // 注:这行代码会导致输入冲突,应只使用一种方式
    }
    for (int i = 0; i < 4; i++) {
        // 两种等价的写法
        printf("数组第%d个数:%d\n", i, array[i]);
        printf("数组第%d个数:%d\n", i, *(array + i));
    }

指针类型变量的大小

打印不同类型的指针变量的大小。

    // 指针类型变量在 64 位 CPU 的系统下的大小为 8 个字节
    // 指针类型变量在 32 位 CPU 的系统下的大小为 4 个字节
    // 在 64 位 Windows 10 系统下指针的大小
    char *p1;
    short *p2;
    int *p3;
    long *p4;
    float *p5;
    double *p6;
    printf("char 类型指针%p的大小为:%d\n", (void *)p1, (int)sizeof(p1));
    printf("short 类型指针%p的大小为:%d\n", (void *)p2, (int)sizeof(p2));
    printf("int 类型指针%p的大小为:%d\n", (void *)p3, (int)sizeof(p3));
    printf("long 类型指针%p的大小为:%d\n", (void *)p4, (int)sizeof(p4));
    printf("float 类型指针%p的大小为:%d\n", (void *)p5, (int)sizeof(p5));
    printf("double 类型指针%p的大小为:%d\n", (void *)p6, (int)sizeof(p6));

完整实例代码

#include <stdio.h>

int main() {
    int array[4];
    // 数组变量指向存储空间的首地址
    printf("数组的地址:%p\n", (void *)&array);
    printf("数组指针指向的地址:%p\n", (void *)array);
    printf("数组第一个元素的地址:%p\n", (void *)&array[0]);

    // 对指针进行加减操作,使指针指向上一个或下一个存储单元,存储单元的大小由数据类型决定,例如 char 是 1 byte, int 是 4 byte
    for (int i = 0; i < 4; i++) {
        printf("请输入第%d个数:\n", i + 1);
        scanf("%d", &array[i]);
    }
    for (int i = 0; i < 4; i++) {
        // 两种等价的写法
        printf("数组第%d个数:%d\n", i, array[i]);
        printf("数组第%d个数:%d\n", i, *(array + i));
    }

    // 指针类型变量在 64 位 CPU 的系统下的大小为 8 个字节
    // 指针类型变量在 32 位 CPU 的系统下的大小为 4 个字节
    // 在 64 位 Windows 10 系统下指针的大小
    char *p1;
    short *p2;
    int *p3;
    long *p4;
    float *p5;
    double *p6;
    printf("char 类型指针%p的大小为:%d\n", (void *)p1, (int)sizeof(p1));
    printf("short 类型指针%p的大小为:%d\n", (void *)p2, (int)sizeof(p2));
    printf("int 类型指针%p的大小为:%d\n", (void *)p3, (int)sizeof(p3));
    printf("long 类型指针%p的大小为:%d\n", (void *)p4, (int)sizeof(p4));
    printf("float 类型指针%p的大小为:%d\n", (void *)p5, (int)sizeof(p5));
    printf("double 类型指针%p的大小为:%d\n", (void *)p6, (int)sizeof(p6));

    return 0;
}

注意事项

  • printf 中打印指针时,应将指针强制转换为 (void *) 类型,以确保跨平台兼容性。
  • scanf 中,应只使用一种方式读取输入,避免输入冲突。
  • 指针的大小在 64 位系统中通常是 8 字节,在 32 位系统中通常是 4 字节。