我们应该实现一个通用的函数,专门用于数组的值复制,这就用到了通用指针,我们想使用一个函数使用通用型指针来接收2个数组的首地址,然后进行数组的值复制。即支持char,也支持int,也支持double,实际上这个函数可以支持所有数据类型的数组复制:
void array_copy(void *src, void *tar, int element_size, int array_size){ for (int i = 0; i < element_size * array_size; i++) { *(char *) tar = *(char *) src; tar++; src++; }}
array_copy函数有4个参数:
- void *src 存放来源数组首地址的通用指针
- void *tar 存放目标数组首地址的通用指针
- int element_size 数组元素大小在调用时使用sizeof函数来计算
- int array_size 数组元素个数
有了这个函数就可以方便的对不同类型的数组做复制了:
int main(int argc, char **args){ char array_0[SIZE] = { 'H', 'e', 'l', 'l', 'o' }; char array_1[SIZE]; int array_2[SIZE] = { 1, 2, 3, 4, 5 }; int array_3[SIZE]; double array_4[SIZE] = { 12.3, 23.4, 34.5, 45.6, 56.7 }; double array_5[SIZE]; array_copy(array_0, array_1, sizeof(char), SIZE); array_copy(array_2, array_3, sizeof(int), SIZE); array_copy(array_4, array_5, sizeof(double), SIZE); for (int i = 0; i < SIZE; i++) { printf("%c ", array_1[i]); } printf("\n"); for (int i = 0; i < SIZE; i++) { printf("%d ", array_3[i]); } printf("\n"); for (int i = 0; i < SIZE; i++) { printf("%f ", array_5[i]); } printf("\n");}
==============
二级指针
进入正题,到底二级指针有何具体作用?
用作二维数组:
1 2 3 4 5 6 7 8 9 |
|
在申请完内存后,array就可以利用下标进行访问了,可以和我们定义传统的二维数组访问方式一致。
1 |
|
但是这里需要区分是,int array[][]如此定义的二维数组在内容里的寻址空间是连续的,而int **array在申请内存后的寻址空间是分散连续的,对比图: