वैसे मुझे भी कुछ जोड़ना है। संरचना सरणी की तुलना में थोड़ा अलग है क्योंकि सरणी एक सूचक है और संरचना नहीं है। तो सावधान रहें!
मुझे लगता है मैं कोड के इस बेकार टुकड़ा लिखते हैं:
#include <stdio.h>
typedef struct{
int km;
int kph;
int kg;
} car;
int main(void){
car audi = {12000, 230, 760};
car *ptr = &audi;
}
यहाँ सूचक ptr
पता (करने के लिए अंक ! ) संरचना चर के audi
लेकिन पता संरचना के बगल में भी एक है डेटा का हिस्सा ( ! )! डेटा के चंक के पहले सदस्य के पास संरचना की तुलना में एक ही पता है और आप इसे केवल इस तरह *ptr
(कोई ब्रेसिज़) एक पॉइंटर को डीरफेरिंग करके डेटा प्राप्त कर सकते हैं ।
लेकिन आप पहले एक के अलावा कोई अन्य सदस्य तक पहुंचने चाहते हैं, आप की तरह एक डेसिग्नेटर जोड़ने के लिए .km
, .kph
, .kg
जो के आधार का पता करने के लिए ऑफसेट की तुलना में ज्यादा कुछ नहीं हैं डेटा का हिस्सा ...
लेकिन अधिकता के कारण, आप *ptr.kg
एक्सेस ऑपरेटर के रूप में नहीं लिख सकते क्योंकि .
मूल्यांकन ऑपरेटर से पहले मूल्यांकन किया जाता है *
और आपको मिलेगा *(ptr.kg)
जो कि संभव नहीं है क्योंकि सूचक में कोई सदस्य नहीं है! और संकलक यह जानता है और इसलिए एक त्रुटि जारी करेगा उदा:
error: ‘ptr’ is a pointer; did you mean to use ‘->’?
printf("%d\n", *ptr.km);
इसके बजाय आप इसका उपयोग करते हैं (*ptr).kg
और आप कंपाइलर को 1 पॉइंटर को पॉजिटिव करने के लिए मजबूर करते हैं और एसेस को डेटा और 2 के चंक को सक्षम करते हैं आप सदस्य को चुनने के लिए ऑफ़सेट (डिज़ाइनर) जोड़ते हैं।
इस छवि की जाँच करें जो मैंने बनाई थी:
लेकिन अगर आपके पास नेस्टेड सदस्य होते हैं तो यह सिंटैक्स अपठनीय हो जाएगा और इसलिए ->
इसे पेश किया गया था। मुझे लगता है कि पठनीयता इसका उपयोग करने का एकमात्र औचित्य है क्योंकि यह ptr->kg
लिखने की तुलना में बहुत आसान है(*ptr).kg
।
अब हम इसे अलग से लिखते हैं ताकि आप कनेक्शन को अधिक स्पष्ट रूप से देख सकें। (*ptr).kg
⟹ (*&audi).kg
⟹ audi.kg
। यहाँ मैं पहले तथ्य यह है कि इस्तेमाल किया ptr
एक है "का पता audi
" यानी &audi
और तथ्य यह है कि "संदर्भ" &
और "भिन्नता" *
ऑपरेटरों eachother को निरस्त कर देते।