C语言中,通过指针传递数据是常见的编程方式,它可以使变量在多个函数中共享,同时也可以避免函数返回值造成的资源浪费等问题。
一、指针的基础语法
指针是存储其他变量地址的变量,可以通过 * 运算符获取该地址存储的值。指针的定义方式如下:
int *p; // 定义一个指向 int 类型变量的指针
通过 & 运算符可以获取变量的地址,如:
int a = 1;
int *p = &a; // 将指针 p 指向变量 a 的地址
通过 * 运算符可以获取指针所指向的变量值,如:
int a = 1;
int *p = &a; // 将指针 p 指向变量 a 的地址
*p = 2; // 修改指针所指向变量的值
二、指针传递参数实现
指针可以作为函数参数进行传递,实现变量在多个函数中共享。示例代码如下:
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int a = 1, b = 2;
swap(&a, &b); // 传递 a 和 b 变量的地址
printf("a = %d, b = %d\n", a, b); // 输出 a = 2, b = 1
return 0;
}
通过传递 a 和 b 变量的地址给函数,swap 函数可以修改原始变量的值。
三、动态内存分配与释放
指针还可以用于动态内存分配,即在程序运行时动态地分配内存空间,用完后再释放。常用的动态内存分配函数有 malloc、calloc 和 realloc。
其中,malloc 函数用于动态地分配一块指定大小的内存空间,示例代码如下:
int *p = (int *) malloc(sizeof(int) * 10); // 动态分配 10 个 int 类型的空间
calloc 函数与 malloc 类似,可以动态分配一块指定大小的内存空间,同时会自动将空间初始化为 0,示例代码如下:
int *p = (int *) calloc(10, sizeof(int)); // 动态分配 10 个 int 类型的空间,并将空间初始化为 0
realloc 函数可以对已分配的内存空间进行大小调整,示例代码如下:
int *p = (int *) malloc(sizeof(int) * 10); // 分配 10 个 int 类型的空间
p = (int *) realloc(p, sizeof(int) * 20); // 调整为 20 个 int 类型的空间
动态内存分配后,必须使用 free 函数手动释放内存空间,示例代码如下:
int *p = (int *) malloc(sizeof(int) * 10); // 分配 10 个 int 类型的空间
...
free(p); // 释放动态分配的内存空间
四、结构体指针传递参数实现
在程序设计中,我们常常需要处理结构体类型的数据。结构体是一种自定义的数据类型,可以存储多个不同类型的数据。通过结构体指针传递参数,可以避免结构体作为参数时进行复制带来的开销等问题。示例代码如下:
typedef struct {
int x;
int y;
} Point;
void move(Point *p, int dx, int dy) {
p->x += dx;
p->y += dy;
}
int main() {
Point p = {1, 2};
move(&p, 1, 1); // 传递结构体指针和偏移量
printf("(%d, %d)\n", p.x, p.y); // 输出 (2, 3)
return 0;
}
通过传递结构体指针和偏移量,move 函数可以修改结构体中的变量值,实现结构体的移动功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言用指针传递数据 - Python技术站