从5个维度来看C语言指针(指针就是个纸老虎)

引言

指针是C语言中最重要的概念之一,也是最容易混淆的概念。有些人甚至把指针看作是C语言的魔法,它既神奇又可怕。但是,指针并不是什么神秘的东西,只要理解了它的本质,就会发现它其实很简单。本文将从5个维度来看C语言指针,解释指针的本质和作用。

从5个维度来看C语言指针(指针就是个纸老虎)

维度一:指针的定义

指针是一个变量,其值为另外一个变量的地址。指针变量存储的是内存地址,而不是实际的值。指针用于动态分配内存、数组操作、传递指针参数等场景。

int a = 10; // 定义一个整型变量a
int *p; // 定义一个指针变量p
p = &a; // 取a的地址赋给p

在上面的代码中,定义了一个整型变量a和一个指针变量p,然后将a的地址赋给了p。此时,p指向a所在的内存地址,可以通过*p来获取a的值。

维度二:指针的算术运算

指针可以进行算术运算,包括加法、减法、比较等运算。指针的算术运算实际上就是对指针的地址进行加减操作。指针加上一个整数n,就相当于将指针指向的地址增加n个字节。

int a[5] = {1, 2, 3, 4, 5}; // 定义一个整型数组a
int *p = a; // 定义一个指向a的指针变量p
p++; // 将p指向a[1]

在上面的代码中,定义了一个整型数组a和一个指向a的指针变量p,然后将p加1,就相当于将p指向a[1]。

维度三:指针和数组

指针和数组是密不可分的,因为数组名本身就是一个指向数组首元素的指针。可以通过指针来访问数组元素,也可以通过数组名来访问数组元素。此外,指针和数组还可以相互转换。

int a[5] = {1, 2, 3, 4, 5}; // 定义一个整型数组a
int *p = a; // 定义一个指向a的指针变量p
printf("%d\n", p[2]); // 输出a[2]的值
printf("%d\n", *(p+2)); // 输出a[2]的值

在上面的代码中,定义了一个整型数组a和一个指向a的指针变量p,然后分别通过数组下标和指针加法来访问a[2]的值。

维度四:指针和函数

指针和函数也是密不可分的,因为指针可以用来传递函数参数和返回函数值。通过指针参数,可以在函数内部修改指针指向的变量的值。通过指针返回值,可以在函数外部访问函数内部的变量。

void swap(int *a, int *b) { // 定义一个交换函数
    int temp = *a;
    *a = *b;
    *b = temp;
}
int main() {
    int x = 10, y = 20;
    swap(&x, &y); // 调用交换函数
    printf("x=%d,y=%d\n", x, y); // 输出x=20,y=10
    return 0;
}

在上面的代码中,定义了一个交换函数swap,它的参数是两个指向整型变量的指针。在函数内部,通过指针交换了两个变量的值,并将结果返回到main函数中。

维度五:指针和结构体

指针和结构体也是密不可分的,因为结构体变量可以包含指针成员。通过结构体指针,可以访问结构体成员,也可以动态创建和销毁结构体。

struct student { // 定义一个学生结构体
    char name[20];
    int age;
};
int main() {
    struct student *p = (struct student*)malloc(sizeof(struct student)); // 动态创建结构体
    strcpy(p->name, "Tom"); // 对结构体成员赋值
    p->age = 20;
    printf("name=%s,age=%d\n", p->name, p->age); // 输出结构体成员的值
    free(p); // 释放结构体内存
    return 0;
}

在上面的代码中,定义了一个学生结构体,包含姓名和年龄两个成员。然后通过malloc函数动态创建了一个结构体变量,对结构体成员赋值,最后输出结构体成员的值,并通过free函数释放了结构体内存。

结论

通过以上5个维度来看C语言指针,我们可以发现指针并不是什么神秘的东西,只要理解了它的本质,就会发现它实际上很简单。指针是C语言中最重要的概念之一,掌握好指针,就可以写出高效、灵活、易于维护的代码。

最后编辑于:2023/09/22作者: 心语漫舞