Rumah > pembangunan bahagian belakang > C++ > Mengapakah Saya Tidak Boleh Melepasi Tatasusunan Berbilang Dimensi kepada Fungsi sebagai Tatasusunan Penunjuk dalam C?

Mengapakah Saya Tidak Boleh Melepasi Tatasusunan Berbilang Dimensi kepada Fungsi sebagai Tatasusunan Penunjuk dalam C?

Patricia Arquette
Lepaskan: 2024-12-15 15:03:22
asal
814 orang telah melayarinya

Why Can't I Pass a Multidimensional Array to a Function as an Array of Pointers in C  ?

Memahami Ketidakupayaan untuk Melepasi Tatasusunan Berbilang Dimensi kepada Fungsi

Pertimbangkan coretan kod berikut:

#include <stdio.h>
void print(int *arr[], int s1, int s2) {
    int i, j;
    for(i = 0; i < s1; i++)
        for(j = 0; j < s2; j++)
            printf("%d, ", *((arr + i) + j));
}

int main() {
    int a[4][4] = {{0}};
    print(a, 4, 4);
}
Salin selepas log masuk

Kod ini bertujuan untuk menghantar tatasusunan berbilang dimensi a kepada cetakan fungsi yang mengambil tatasusunan penunjuk int int *arr[]. Walau bagaimanapun, dalam C , kod ini menghasilkan ralat berikut:

cannot convert `int (*)[4]' to `int**' for argument `1' to
`void print(int**, int, int)'
Salin selepas log masuk

Penjelasan:

Inti isu ini terletak pada jenis data yang tidak serasi. Tatasusunan berbilang dimensi gaya C seperti a tidak boleh ditukar terus kepada penuding kepada tatasusunan penunjuk int *arr[]. Dalam C , jenis data a ialah int[4][4], yang mewakili tatasusunan dua dimensi integer. Sebaliknya, int *arr[] ialah penunjuk kepada tatasusunan integer, di mana setiap elemen ialah penunjuk kepada integer.

Penyelesaian:

Kepada selesaikan isu ini dan hantar tatasusunan multidimensi kepada fungsi yang mengambil tatasusunan penunjuk int, anda boleh mengubah suai kod untuk menukar tatasusunan multidimensi secara eksplisit kepada pelbagai penunjuk. Ini boleh dicapai dengan menggunakan teknik seperti yang diterangkan dalam jawapan yang diterima untuk soalan "Menukar tatasusunan berbilang dimensi kepada penunjuk dalam C ".

Nota Tambahan:

  • Kod yang dibentangkan dalam contoh awal menunjukkan tingkah laku yang tidak dijangka dalam C disebabkan oleh pepijat tambahan dalam percetakan kod.
  • Adalah penting untuk memulakan tatasusunan a dengan nilai bukan sifar untuk melihat kesan pepijat dalam hantaran tatasusunan.
  • Ralat dalam hantaran tatasusunan disembunyikan dalam C kerana pencetakan pepijat.
  • Mesej ralat C memberikan petunjuk yang jelas tentang isu penukaran, manakala pengkompil C mungkin mengeluarkan amaran yang boleh tersilap diabaikan.

Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Melepasi Tatasusunan Berbilang Dimensi kepada Fungsi sebagai Tatasusunan Penunjuk dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan