Tôi nhận được thông báo sau: incompatible pointer types 'void**' and 'int* [2]'
.void ** pointer and void * [] làm tham số chức năng
Khi tôi cố gắng biên dịch đoạn mã sau:
#include <stdlib.h>
void func1(void *arr[]) { }
int main() {
int *arr[2];
for (int i = 0; i < 5; i++) {
arr[i] = (int*)malloc(sizeof(int));
*(arr[i]) = 5;
}
func1(arr);
}
Bây giờ, nó hoạt động khi tôi đúc arr với (void**)
, và tôi không thể tìm thấy một lý do cho điều đó. Hơn nữa tôi thấy rằng tôi cũng cần phải đúc trong đoạn mã sau:
#include <stdlib.h>
void func1(void **arr) { }
int main() {
int **arr;
int i[] = { 1, 2 };
int j[] = { 3, 4 };
*arr = i;
*(arr+1) = j;
func1(arr); //Doesn't compile unless I use (void*) or (void**) casting
}
Tôi biết rằng nếu tham số của hàm là một con trỏ để void
chúng ta có thể vượt qua nó bất cứ điều gì con trỏ chúng ta muốn mà không đúc bởi vì tất cả con trỏ là của cùng kích thước thì tại sao tôi không thể chuyển con trỏ tới con trỏ theo cùng một cách?
Ý của bạn là 'int * arr [5]; '? –
Vì con trỏ tới con trỏ không phải là con trỏ tới 'void'. Chỉ một con trỏ tới 'void' được đảm bảo tương thích với các con trỏ khác. –
Nếu con trỏ là mảng, chúng sẽ không được gọi là "con trỏ". – Olaf