一、指针作函数参数的基本概念
在C语言中,指针是一种特殊的变量类型,它存储了另一个变量的内存地址。当我们将一个指针作为函数参数传递时,实际上是将该指针所指向的内存地址传递给函数。这样,函数就可以通过这个内存地址来访问和修改原始变量的值。这种特性使得指针在处理数组、结构体等复杂数据类型时具有很大的灵活性。
二、指针作函数参数的使用场景
1. 数组作为函数参数
数组名本身就是一个指针,因此可以将数组作为函数参数传递。这样,函数可以直接操作数组的元素,而无需关心数组的大小。下面是一个示例:
c
#include <stdio.h>
void print_array(int *arr, int size) {
for (int i = 0; i < size; i++) {
printf("%d ", arr[i]);
}
printf("
");
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);
print_array(arr, size);
return 0;
}
在这个示例中,print_array
函数接受一个整数数组指针arr
和一个整数size
作为参数。通过遍历数组并打印每个元素,我们可以实现对数组的操作。
2. 结构体作为函数参数
结构体是一种复合数据类型,它可以包含多个不同类型的成员变量。当结构体作为函数参数传递时,可以将其视为一个整体,并通过指针或引用来访问和修改其成员变量。下面是一个示例:
c
#include <stdio.h>
typedef struct {
int x;
int y;
} Point;
void move_point(Point *p, int dx, int dy) {
p->x += dx;
p->y += dy;
}
int main() {
Point p = {1, 2};
printf("Before moving: (%d, %d)
", p.x, p.y);
move_point(&p, 3, 4);
printf("After moving: (%d, %d)
", p.x, p.y);
return 0;
}
在这个示例中,我们定义了一个名为Point
的结构体,包含两个整数成员变量x
和y
。move_point
函数接受一个Point
结构体指针p
以及两个整数dx
和dy
作为参数。通过修改指针所指向的结构体的成员变量,我们可以实现对结构体的修改。
3. 动态内存分配
在某些情况下,我们需要根据程序运行时的需求来分配内存。这时,可以使用指针作为函数参数,以便在函数内部分配和释放内存。下面是一个示例:
c
#include <stdio.h>
#include <stdlib.h>
void reverse_string(char **str) {
int len = strlen(*str);
char *reversed = (char *)malloc((len + 1) * sizeof(char));
if (reversed == NULL) {
printf("Memory allocation failed.
");
return;
}
for (int i = 0; i < len; i++) {
reversed[i] = (*str)[len - 1 - i];
}
reversed[len] = '\0';
free(*str);
*str = reversed;
}
int main() {
char *str = strdup("Hello, world!");
printf("Original string: %s
", str);
reverse_string(&str);
printf("Reversed string: %s
", str);
free(str);
return 0;
}
在这个示例中,我们定义了一个名为reverse_string
的函数,接受一个字符指针的指针str
作为参数。在函数内部,我们使用malloc
函数为字符串分配内存,并将反转后的字符串赋值给原来的指针。最后,我们使用free
函数释放原始字符串所占用的内存。