一、指针变量的定义与声明
1.1 定义
指针变量是用来存储另一个变量的内存地址的变量。在C语言中,指针变量的类型是指向某个类型的指针。例如,int *p; 表示一个整型指针变量p。
1.2 声明
指针变量的声明分为两种形式,一种是直接声明,另一种是动态声明。直接声明是在声明变量的同时指定其类型为指针,例如:int *p;。动态声明是在声明变量后,再为其分配内存空间并指定其类型为指针,例如:int *p = (int *)malloc(sizeof(int));。
1.3 初始化
指针变量可以在声明时进行初始化,也可以在声明后再进行初始化。初始化时,需要使用取址运算符&来获取变量的内存地址,例如:int a = 10; int *p = &a;。
实际例子解析说明:
#include <stdio.h>
#include <stdlib.h>int main() {int a = 10; // 定义一个整型变量aint *p; // 定义一个整型指针变量pp = &a; // 将变量a的内存地址赋值给指针变量pprintf("a的值:%d
", a); // 输出变量a的值printf("a的内存地址:%p
", &a); // 输出变量a的内存地址printf("p的值:%p
", p); // 输出指针变量p的值,即变量a的内存地址printf("p指向的值:%d
", *p); // 输出指针变量p指向的值,即变量a的值return 0;
}
二、指针变量的使用
2.1 间接寻址
通过指针变量可以间接地访问其他变量的内存地址,从而实现对其他变量的操作。例如,可以通过指针变量p来修改变量a的值。
实际例子解析说明:
#include <stdio.h>int main() {int a = 10; // 定义一个整型变量aint b = 20; // 定义一个整型变量bint *p = &a; // 将变量a的内存地址赋值给指针变量p*p = b; // 通过指针变量p间接地修改变量a的值printf("a的值:%d
", a); // 输出变量a的值,此时应为20printf("b的值:%d
", b); // 输出变量b的值,此时应为20return 0;
}
2.2 函数参数传递
函数参数传递时,可以使用指针变量来实现对实参的修改。例如,可以将数组作为函数参数传递,通过指针变量来修改数组的元素值。
实际例子解析说明:
#include <stdio.h>void modify_array(int *arr, int size) {for (int i = 0; i < size; i++) {arr[i] *= 2;}
}int main() {int arr[] = {1, 2, 3, 4, 5};int size = sizeof(arr) / sizeof(arr[0]);printf("原数组:");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("
");modify_array(arr, size);printf("修改后的数组:");for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}printf("
");return 0;
}
2.3 动态内存分配
指针变量可以用来动态地分配和释放内存空间。例如,可以使用malloc函数为指针变量分配内存空间,然后通过指针变量来访问和操作这块内存空间。
实际例子解析说明:
#include <stdio.h>
#include <stdlib.h>int main() {int n = 5;int *arr = (int *)malloc(n * sizeof(int)); // 为指针变量arr分配内存空间if (arr == NULL) {printf("内存分配失败!
");return 1;}for (int i = 0; i < n; i++) {arr[i] = i + 1;}printf("数组元素:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("
");free(arr); // 释放指针变量arr所指向的内存空间return 0;
}