İki boyutlu bir dizi için bir işaretçi oluşturmak
2 boyutlu statik bir dizi için bir işaretçi ihtiyacım var. Bu nasıl yapılıyor?
static uint8_t l_matrix[10][20];
void test(){
uint8_t **matrix_ptr = l_matrix; //wrong idea
}
Hataları gibi her türlü olsun:
- uyarı: uygun olmayan atama işaretçi türü
- alt değer ne dizi ne de işaretçi
- hata: esnek dizi kullanımı geçersiz üyesi
CEVAP
Burada istediğin bir dizinin ilk öğe için bir işaretçi
uint8_t (*matrix_ptr)[20] = l_matrix;
Typedef ile, bu temiz görünüyor
typedef uint8_t array_of_20_uint8_t[20];
array_of_20_uint8_t *matrix_ptr = l_matrix;
Sonra hayattan yeniden zevk :)
matrix_ptr[0][1] = ...;
C pointer/array world dikkat edin, fazla karışıklık bu civarında.
< / ^ hr .
Edit
Diğer cevaplar burada, yorum alanları nedeniyle bazı inceleme yapmak için çok kısa. Birden çok alternatif önermiş, ama onlar nasıl davranması gösterilen değildi. Bunu nasıl yaptıklarını burada
uint8_t (*matrix_ptr)[][20] = l_matrix;
Hata düzeltme ve adresi-operatör eklemek &
aşağıdaki kod parçasında olduğu gibi
uint8_t (*matrix_ptr)[][20] = &l_matrix;
Sonra bir 20 uint8_t türü dizi elemanlarının eksik dizi bir türü için bir işaretçi oluşturur. İşaretçiyi bir dizi bir dizi için, çünkü, sen gir
(*matrix_ptr)[0][1] = ...;
Ve tamamlanmamış bir dizi için bir işaretçi var çünküolamazbir kısayol yap
matrix_ptr[0][0][1] = ...;
Çünkü dizin öğesi türünün bilinen boyutu (dizin işaretçisi bir tamsayı bir ek ifade eder, eksik türleri ile çalışmaz yani) gerektirir. Bu sadece T[]
T[N]
uyumlu türüdür çünkü C
çalışır unutmayın. C diye bir kavram yokuyumlu türlerT[]
T[10]
farklı türleri vardır, çünkü bu kod reddetmek, böylece , ve.
< / ^ hr .
Aşağıdaki alternatif tek boyutlu bir dizi olarak görüntülemek dizi öğesi türü, çünkü hiç işe yaramazdeğiluint8_t
ama uint8_t[20]
uint8_t *matrix_ptr = l_matrix; // fail
< / ^ hr .
Aşağıdaki iyi bir alternatif
uint8_t (*matrix_ptr)[10][20] = &l_matrix;
Size erişim
(*matrix_ptr)[0][1] = ...;
matrix_ptr[0][0][1] = ...; // also possible now
Dış boyutlar boyutu koruyan yararı vardır. Üzerinde boyutu uygulayabilirsiniz
sizeof (*matrix_ptr) == sizeof(uint8_t) * 10 * 20
< / ^ hr .
Bir dizideki öğeleri bitişik saklı olduğu gerçeğini bir şekilde kullanan başka bir cevap yoktur
uint8_t *matrix_ptr = l_matrix[0];
Şimdi, resmi olarak sadece iki boyutlu bir dizinin ilk öğesi öğeleri erişim sağlar. Diğer bir deyişle, aşağıdaki koşul tutun
matrix_ptr[0] = ...; // valid
matrix_ptr[19] = ...; // valid
matrix_ptr[20] = ...; // undefined behavior
matrix_ptr[10*20-1] = ...; // undefined behavior
Muhtemelen 10*20-1
için çalıştığını göreceksiniz ama eğer diğer analiz ve diğer agresif optimizasyon üzerine atarsan, bazı derleyici bu kodu kırabilir bir varsayım yapabiliriz. Bunu söyledikten sonra, ben daha önce karşılaşılan bir derleyici başarısız (ama sonra tekrar, ben değil kullanılan Bu teknikte gerçek kod) ve hatta C SSS olan teknik kontrol ile bir uyarı hakkında İK'ness), ve eğer değiştiremezsiniz dizi, yazın bu son seçenek için kaydedin :)
Sözdizimi, iki boyutlu bir dizi oluştu...
Nasıl Java genel bir dizi oluşturmak i...
En verimli şekilde sıfır JavaScript di...
Nasıl Ruby başka bir dizi için bir diz...
Nasıl python iki boyutlu bir dizi tanı...