Tại sao địa chỉ của mảng không thể chuyển đổi thành ** trong C?

lập trình


Xin chào. Tại sao địa chỉ của mảng (tức là &) không thể chuyển đổi thành ** trong C?

Những gì tôi đã thử:

Tôi đã thử cách sau ..

C
#include <stdio.h>


int main()
{
    int** a;
    int b[5];
    b[1] = 123;
    
    //a = &b; //< results in output of warning "assignment to ‘int **’ from incompatible pointer type ‘int (*)[5]’"
    int* c = b;
    a = &c; //< this works
    printf("*a is %i\n", (*a)[1]);
    
    return 0;
}

Tôi mong đợi điều đó, như b có thể được chuyển đổi thành int*có thể chuyển đổi &b ĐẾN int**. Tuy nhiên, điều này dẫn đến cảnh báo được đề cập trong khối mã ở trên.

Sử dụng mingw gcc trên windows này (viết và sau đó đọc từ một ** được gán cho địa chỉ của một mảng) thực sự hoạt động một lần nhưng không hoạt động lần thứ hai.

Giải pháp 1

b là một mảng: tên của mảng là một con trỏ tới phần tử đầu tiên, vì vậy về mặt kỹ thuật, &b là một con trỏ tới một con trỏ tới một số nguyên. Nhưng … trình biên dịch của bạn không đồng ý vì nó (chính đáng) coi nó là một con trỏ tới một mảng các số nguyên. Và mảng là một cú pháp tổng hợp cho phép tính số học con trỏ diễn ra ở chế độ nền nên chúng không hoạt động hoàn toàn như bạn nghĩ.
Bạn có thể làm tròn nó bằng cách thực hiện b thay vào đó, một con trỏ tới int:

C
#include <stdio.h>
#include <malloc.h>
int main()
    {
    int** a;
    int* b = malloc(sizeof(int) * 5);
    b[1] = 123;
    
    a = &b; 
    printf("*a is %i\n", (*a)[1]);

    free(b);
    return 0;
    }

コメント

タイトルとURLをコピーしました