C dagi strukturalar ko'rsatkichlari qatorini aniqlang

Menda umumiy tuzilma e'lon qilingan va bu tuzilmalar qatori quyida keltirilgan:

struct A
{
    int x,y,z;
    char a,b,c;
};

struct A *str_arr[5];

Mening tushunishimga ko'ra, str_arr xotira blokiga ko'rsatgich bo'lib, u 5 ta strukturaga ko'rsatgichlarni ketma-ket tartibda saqlaydi va shuning uchun bu ko'rsatkichlarga ko'rsatgich arifmetikasi yoki massiv indekslash orqali kirish mumkin:

struct A *str_a = str_arr[1];                    // points to 2nd struct?
struct A *str_b = str_arr + 2*sizeof(struct A*); // points to 3rd struct?

Biroq, bu 5 ta struktura ketma-ket xotirada bo'lmasligi mumkinmi?

printf("%p\n", str_arr);              // prints memory location of start of str_arr pointers?
printf("%p\n", str_arr[1])            // prints memory location of 2nd struct?
printf("%d\n" str_arr == &str_arr[0]) // prints 1?

Men ko'targan barcha fikrlarim bilan mening tushuncham to'g'ri ekanligini tushuntirishni istardim.


person sooty1892    schedule 28.05.2015    source manba
comment
str_arr - struct A ga ko'rsatgich massivi (struct A ga beshta ko'rsatkich).   -  person BLUEPIXY    schedule 28.05.2015
comment
Xuddi int a[42] dagi butun sonlar ketma-ket tartibda bo'lishi shart emas. Siz u erga nima qo'ygan bo'lsangiz, ular.   -  person juanchopanza    schedule 28.05.2015


Javoblar (1)


Bittasidan tashqari hammasi to'g'ri:

struct A **str_b = str_arr + 2 /* *sizeof(struct A*) */;
/*       ^^                    ^^^^^^^^^^^^^^^^^^^^^^ */
/* Not need to multiply with size. Dereference with * if your type is struct A * */

or

struct A *str_b = *(str_arr + 2);

Ofsetni baytlarda emas, balki elementlar soni bo'yicha berasiz.

str_arr + 2*sizeof(struct A*) &str_arr[2*sizeof(struct A*)] ga teng

             +0  +1  +2  +3  +4
           +---+---+---+---+---+
           | A | B | C | D | E |
           +---+---+---+---+---+
str_arr    ^^^^^^^^^^^^^^^^^^^^^
&str_arr[0]^^^^   
str_arr[1] = B
  • str_arr massiv boshlanish manzili
  • str_arr[1] - +1 ofsetidagi tarkib, ya'ni B, struct A turdagi ob'ektga ishora qiluvchi manzil.
  • str_arr == &str_arr[0] har xil turdagi bir xil manzil

@Gopi tomonidan taklif qilinganidek, oxirgi nuqta quyidagilarni chop etish orqali isbotlanishi mumkin:

  1. sizeof str_arr v/s &str_arr[0]
  2. Quyidagi manzil, &str_arr + 1 v/s str_arr + 1
person Mohit Jain    schedule 28.05.2015
comment
Ha, bu faqat boshqa turdagi bilan. Bu shuni anglatadiki, &str_arr va str_arr + 0 dan yaratilgan manzillar bir xil, lekin &str_arr + 1 va str_arr + 1 iboralaridan yaratilgan manzillar boshqacha - person Mohit Jain; 28.05.2015
comment
Ha, men buni ham javobga qo'shishni nazarda tutganimni bilaman - person Gopi; 28.05.2015
comment
@Gopi Kirish uchun rahmat. Men bu raqam bilan nazarda tutilgan deb o'yladim. ^^^ uzunligi str_arr va &str_arr[0] uchun farq qiladi. Ammo agar siz OP uchun foydaliroq yoki o'qish uchun qulayroq ma'lumot qo'shsangiz, javobni tahrir qilishingiz mumkin. Men sizning taklifingizni qo'shishga harakat qilaman. - person Mohit Jain; 28.05.2015