İşaretçi atamasında (int *)array, (int *)&array ve &array arasındaki fark nedir?

0

Soru

Tam olarak aynı şeyi yapan ancak farklı sözdizimine sahip 3 satırlık kodum var, temel kod şu şekildedir:

    int a, b;
    printf("Enter the size of your array [a][b]: ");
    scanf("%d %d", &a, &b);
    int arr[a][b];

    int *pa;

    pa = (int *)&arr;
     
    for (i = 0; i < a*b; i++)
    {
        printf("[%d] [%d] = ", i/b, i%b);
        scanf("%d", (pa + i));
    }

Satırında pa = (int *)&arr; O hattı değiştirebilirim. (int *)array, (int *)&array, ve &array herhangi bir sorunla karşılaşmadan, yalnızca sonuncusunda bir uyarı yaşarsınız. Doğru sözdiziminin ve bunların 3'ü arasındaki farkın ne olduğunu merak ediyordum.

arrays c pointers
2021-11-24 05:02:40
2
0
  • Doğru sözdizimi şöyledir pa = &arr[0]; ve eğer bir oyuncu kadrosuna ihtiyacın olduğunu fark edersen, yanlış bir şey yapıyorsun demektir. Açıkça söylemek gerekirse, eğer yeni başlayan biriyseniz, asla işaretçi atmamalısınız.

  • pa = &arr "sadece bir uyarı vermez", geçersiz C'dir. Bu, kısıtlama ihlali olarak adlandırılır-uyumlu olmayan işaretçi türlerinin geçersiz atamasıdır. Lütfen C öğrenen yeni başlayanlar için hangi derleyici seçeneklerinin önerildiğini inceleyin? ve bir C derleyicisi bir hata bulduğunda ne yapmalı?

  • Benzer şekilde, pa = (int *)&array uyumlu olmayan türler arasında geçersiz bir işaretçi dönüşümüdür. Derleyecektir, ancak derleyiciye özgü bir sonucu vardır. Kesinlikle yanlış kod konuşuyor, ancak belirli derleyici ve sistem için işe yarayabilir.

  • pa = (int *)array benzer nedenlerden dolayı da yanlıştır-çünkü array ile uyumlu olmayan dizi türüne bir işaretçiye dönüşmüştür. int*.

2021-11-24 10:23:55

Sadece pa = arr yaparsam; bana "uyumsuz işaretçi türünden [Hata] ataması" verir. Öğretmenime bunu sorduğumda bana bunu gösterdi. Yukarıdaki temel kodumla bunu nasıl düzeltebilirim?
Minh Nguyen

@MinhNguyen Ah benim hatam, bunun bir 2D dizisi olduğunu fark etmedim. Cevabı güncelleyecektir.
Lundin

Teşekkürler,bir dahaki sefere böyle bir şey yaptığımda bunu not edeceğim.
Minh Nguyen
0

İki önemli çerez:

  1. Bir dizinin adresi, ilk öğesinin adresidir.
  2. Bir işaretçi olarak ele alındığında, bir dizi ilk öğesine bir işaretçiye dönüşür

Böyle,

  1. pa = arr;
    

    eşdeğerdir

    pa = &(arr[0]);   // Type mismatch: RHS is int (*)[b]
    

    Yaparken hatayı susturmak için bir typecast kullanıyorsunuz pa = (int *)arr;.

  2. pa = &arr;
    

    eşdeğerdir

    pa = &(arr[0]);   // Type mismatch: RHS is int (*)[b]
    

    Yaparken hatayı susturmak için bir typecast kullanıyorsunuz pa = (int *)&arr;.

Bu tür yayınlar güvenli değil. Bunu bir 1d dizisi olarak ele almak istiyorsanız int değerler, bunu da bu şekilde ilan etmek en iyisidir.

2021-11-24 08:04:28

Diğer dillerde

Bu sayfa diğer dillerde

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................