如何初始化int指针数组并正确调用C语言函数F?
解决int指针数组初始化与函数F的调用问题
一、明确类型定义的实际含义
给出的类型定义本质是:
typedef int arr[];:arr是未知大小的int数组类型(不完整数组类型)typedef arr *arr_ptr;:arr_ptr是指向未知大小int数组的指针,等价于int (*)[]
二、int指针数组的初始化
int指针数组指的是元素类型为int*的数组,和上述arr类型(int数组)完全不同,初始化方式如下:
1. 静态初始化(已知元素)
若提前知道要存放的int变量地址,可直接用初始化列表:
int a = 10, b = 20, c = 30; // 定义并初始化包含3个int指针的数组 int* int_ptr_arr[] = {&a, &b, &c};
2. 动态初始化(运行时赋值)
若需根据N动态初始化或后续逐个赋值:
size_t N = 5; // 定义长度为N的int指针数组(栈上分配) int* int_ptr_arr[N]; // 逐个初始化元素(例:指向动态分配的int内存) for (size_t i = 0; i < N; i++) { int_ptr_arr[i] = malloc(sizeof(int)); *int_ptr_arr[i] = i * 10; // 给分配的内存赋值 }
三、正确调用函数F
函数F的参数A和B是arr_ptr(即int (*)[],指向int数组的指针),调用时必须传递整个int数组的地址,直接传数组名会因类型不匹配导致编译失败(数组名会隐式退化为int*)。
调用示例
#include <stddef.h> #include <stdio.h> #include <stdlib.h> // 原类型定义与函数声明 typedef int arr[]; typedef arr *arr_ptr; void F(arr_ptr A, arr_ptr B, size_t N) { // 示例逻辑:遍历数组并赋值 for (size_t i = 0; i < N; i++) { (*A)[i] = (*B)[i] * 2; // 解引用A得到数组,再用下标访问元素 } } int main() { size_t N = 3; // 定义两个长度为N的int数组 int src_arr[N] = {1, 2, 3}; int dest_arr[N] = {0}; // 正确调用:传递数组的地址&src_arr、&dest_arr F(&src_arr, &dest_arr, N); // 验证结果 for (size_t i = 0; i < N; i++) { printf("%d ", dest_arr[i]); // 输出:2 4 6 } return 0; }
关键注意点
- 不要直接传递数组名:比如
F(src_arr, dest_arr, N)会编译报错,因为src_arr退化为int*,和arr_ptr(int (*)[])类型不兼容。 - 在函数F内部访问数组元素:需要先对
A/B解引用(*A)得到整个数组,再用下标[i]访问元素,因为A是指向数组的指针,不是指向单个int的指针。
内容的提问来源于stack exchange,提问作者user3613174
相关产品推荐
相关产品推荐

