অ্যারেতে পয়েন্টারটির এই dereferences সহ আকার কীভাবে কাজ করবে?


9

এখানে আমার কাছে 4 টি পূর্ণসংখ্যার ptrঅ্যারের পয়েন্টার রয়েছে arrptrপুরো অ্যারে নির্দেশ করে। ptr[0]বা *ptrঅ্যারের প্রথম উপাদানটিকে নির্দেশ করে, সুতরাং 1 যুক্ত ptr[0]করে অ্যারের দ্বিতীয় উপাদানটির ঠিকানা দেয়।

আমি বুঝতে পারি না কেন ব্যবহার sizeof(ptr[0])করে পুরো অ্যারের আকার দেয়, 16 বাইট, কেবলমাত্র প্রথম উপাদানটির আকার নয়, 4 বাইট ( ptr[0]অ্যারেতে প্রথম উপাদানটির জন্য পয়েন্ট হিসাবে )।

int arr[4] = {0, 1, 2, 3};
int (*ptr)[4] = &arr;
printf("%zd", sizeof(ptr[0])); //output is 16

দ্বিতীয় লাইন হওয়া উচিত নয় int *ptr = arr;? এটি এটি অ্যারের শুরুতে (প্রথম উপাদানটির) নির্দেশ করবে যা সমান &arr[0]
Andreas Wenzel

1
@ আন্দ্রেয়াস ওয়েঞ্জেল দ্বিতীয় লাইন হওয়া উচিত নয় int *ptr = arr;? আসলে না. চারটি মানের পূর্ণ অ্যারের পয়েন্টার হিসাবে int (*ptr)[4]তৈরি করে । সত্য-বহুমাত্রিক অ্যারেগুলি গতিশীলভাবে বরাদ্দ করার জন্য পয়েন্টার সিনট্যাক্সের মতো। নেস্টেড লুপগুলি দিয়ে তৈরি এবং বহুমাত্রিক অ্যারে হিসাবে ভুলভাবে বর্ণিত "দ্বি-মাত্রিক অ্যারে" সত্যিকার অর্থে একাধিক 1-ডি অ্যারেগুলিতে পয়েন্টারের 1-ডি অ্যারে। স্ট্যাকওভারফ্লো.comptrintmalloc()
অ্যান্ড্রু হেনেল ২

উত্তর:


6

ওপি: ptr[0]অ্যারের প্রথম উপাদানটির দিকে নির্দেশ করে।

টাইপ বিভ্রান্তি। ptr[0]একটি অ্যারে হয়।

ptr একটি হল int- এ অ্যারে 4 পয়েন্টার
ptr[0]যেমন *ptrবিন্যাসকে বিন্যাসকে অ্যারে হিসাবে দেখায় ।
sizeof(ptr[0])একটি অ্যারের আকার হয়।


এর সাথে sizeof(ptr[0]), ptr[0]"টাইপ করতে পয়েন্টার" টাইপযুক্ত একটি এক্সপ্রেশন থাকে না যা অ্যারে অবজেক্টের প্রাথমিক উপাদানটিকে "রূপান্তর" হিসাবে চিহ্নিত করে। (সি 11 ডিআর .36.3.2.1 3)। সহ sizeof, ptr[0]একটি অ্যারে হয়।


1
@ আবদ-এলরহমান মোহাম্মদ সম্মত "তবে পিটিআর [0] [0] একটি পূর্ণসংখ্যা যা পূর্ণসংখ্যার দিকে নির্দেশ করে না"। "পিটিআর [0] হ'ল অ্যারেতে প্রথম উপাদানটির ঠিকানা" সত্য নয়।
chux - মনিকা পুনরায় ইনস্টল করুন

1
@ আবদ-এলরহমানমহমাদ হ্যাঁ, মান একই তবে প্রকারভেদ পৃথক। পিটিআর [0] এর অ্যারে টাইপ আছে এবং &ptr[0][0]এর int *টাইপ রয়েছে
গ্রিন ট্রি

1
@ chux ptr[0](অন্তর্নিহিত রূপান্তরিত int *) প্রথম int উপাদান ঠিকানার মূল্যায়ন করবে।
সবুজ গাছ

1
মাপের সম্পর্কে @ chux - ঠিক আছে, আপনি যা বলেছেন তার প্রসঙ্গে আমি ভুল বুঝেছি
সবুজ বৃক্ষ

1
@ আবদ-এলরহমানমহমাদ তা করেন না printf("someforamt", ptr[0] , ptr[0]+1)এর চেয়ে আলাদা কিছু করে sizeof(ptr[0])ptr[0]প্রথম ক্ষেত্রে একটি inplicit রূপান্তর মাধ্যমে যায়। সাথে sizeof(ptr[0]), ptr[0]না।
chux - মনিকা পুনরায় ইনস্টল করুন 27'19

5

ptrএখানে টাইপটি রয়েছে pointer to an array of 4 int elementsএবং অ্যারের ধরণের আকারটি আপনার প্ল্যাটফর্মে 16 আকারের (আকারের (ইনট) * (এলেমেটেনের সংখ্যা)) রয়েছে।

আমি বুঝতে পারছি না কেন সাইজফ (পিটিআর [0]) ব্যবহার করে পুরো অ্যারেটির আকার দেয় 16 বাইট কেবল প্রথম এলিমেন্টের আকার নয় 4 বাইট

কারণ সি টাইপ সিস্টেমে অ্যারে টাইপ রয়েছে। এখানে উভয় arrএবং *ptrএটি আছে। আপনি যা ঘোষণা করেন যে আপনার কাছে আছে। আকার আকার পেতে এখানে আপনার মাপের (পিটিআর [0] [0]) হওয়া উচিত - যেখানে পিটিআর [0] অ্যারেতে মূল্যায়ন করে।


2

আপনার সাথে int (*ptr)[4] = &arr ;চারটি পূর্ণসংখ্যার অ্যারের একটি পয়েন্টার রয়েছে এবং আরারের দিকে নির্দেশ করা হচ্ছে।

ptrএখন arrডাবল পয়েন্টার মত ইশারা করছে । আমরা উপাদান অ্যাক্সেস করতে পারেন arrব্যবহার ptr[0][x]যেখানে xহতে পারে 0জন্য 4

তাই sizeof(ptr[0])হিসাবে একইsizeof(arr)


2

সংজ্ঞা অনুসারে, ptr[0]একই হিসাবে *(ptr + 0)একই পরিবর্তন হিসাবে একই হয় *ptr। আরও, ptrদিয়ে আরম্ভ করা হয় &arr, তাই *ptrহয় *&arrএবং ঠিক arr। লক্ষ্য করুন এর মধ্যবর্তী স্টোরেজ &arrমধ্যে ptrনেই না কোন অ্যারের ক্ষয় তাই সমানতা রক্ষা করা হয় এবং কোন প্রকার তথ্য হারিয়ে গেছে সঞ্চালন।

দ্রষ্টব্য যে এই সমস্তটি সংকলন-সময়ে গণনা করা হয়েছে, কেবলমাত্র এই অতিরিক্ত সমস্যাটি এড়াতে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.