Mengapa alamat array tidak dapat dikonversi ke ** di C?

pemrograman


Halo. Mengapa alamat array (mis &) tidak dapat diubah menjadi ** di C?

Apa yang saya coba:

Saya mencoba yang berikut ini..

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;
}

Saya mengharapkan itu, sebagai b dapat dikonversi menjadi int*adalah mungkin untuk mengkonversi &b ke int**. Namun, hal ini mengakibatkan peringatan yang disebutkan dalam blok kode di atas.

Menggunakan mingw gcc di windows ini (menulis dan kemudian membaca dari a ** yang ditugaskan ke alamat array) sebenarnya berfungsi sekali tetapi tidak untuk kedua kalinya.

Solusi 1

b adalah array: nama array adalah penunjuk ke elemen pertama, jadi secara teknis, &b adalah penunjuk ke penunjuk ke bilangan bulat. Tapi … kompiler Anda tidak setuju karena (secara wajar) menganggapnya sebagai penunjuk ke array bilangan bulat. Dan array adalah gula sintaksis untuk aritmatika penunjuk yang terjadi di latar belakang sehingga tidak berfungsi seperti yang Anda bayangkan.
Anda bisa menyiasatinya dengan membuat b pointer ke int sebagai gantinya:

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をコピーしました