क्या अलग-अलग प्रकार की कास्टिंग में बहुत बदलाव आता है?


नमस्ते !

मेरे पास एक त्वरित प्रश्न है, मैं सोच रहा था कि कास्ट प्रकार में क्या परिवर्तन होता है। उदाहरण के लिए :

#include <stdio.h>
#include <stdlib.h>

int main()
{
int *x;
char *y;
float *z;

x = (int*)y;
y = (char*)z;

return 0;
}

मैं सोच रहा था कि क्या ईमानदारी से कहूँ तो कुछ बदलेगा।
मेरा क्या मतलब है ? सूचक अंकगणित सूचकों के स्वयं पर आधारित होते हैं न कि उनके मूल्य पर।

उदाहरण के लिए, यदि सूचक “x” एक पूर्णांक है और यह अंकगणित x+1 या x+i के एक अक्षर को इंगित करता है, तो आकार “x” के प्रकार पर आधारित है, न कि “y” के प्रकार पर।

तो हमें अन्य वेरिएबल्स के कास्ट को बदलने की आवश्यकता क्यों है?

मूल रूप से :

#include <stdio.h>
#include <stdlib.h>

int main()
{
int *x;
char *y;

x = (int*)y;
x = (char*)y;

return 0;
}

इससे कुछ भी नहीं बदलना चाहिए.

मैं जानता हूं कि प्रकारों का मिश्रण एक अच्छा विचार नहीं है, लेकिन ईमानदारी से कहूं तो मैं प्रकार की कास्टिंग के साथ थोड़ा मिश्रित था।

पुनश्च.

मुझे कुछ उदाहरण मिले हैं कि टाइप कास्ट बदलना कैसा दिखता है:

उद्धरण:

*(int *)((char *)ptr + 2*sizeof(int))

वास्तव में यह नहीं पता था कि यहाँ क्या होता है और पीटीआर प्रकार दो बार क्यों बदला जाता है। यह सूचक अंकगणित के बारे में कुछ है लेकिन मैंने इसकी कल्पना की थी कि यदि मेरे पास पीटीआर + 1 है तो यह (पीटीआर+1*आकार(इंट)) है, और यहां मेरे पास (चार*) और दूसरा (इंट*) है इसलिए मेरे पास (पीटीआर) है +1*sizeof(int)) गुणा sizeof(char) और फिर गुणा sizeof(int) ???? अजीब।

मैंने क्या प्रयास किया है:

मैंने ज्यादातर यह सोचने की कोशिश की कि ऐसा क्यों है जब सूचक सिर्फ पता लेता है तो प्रकार क्यों बदल रहा है।

समाधान 1

यदि आप किसी पॉइंटर पर +1 करते हैं, तो यह पॉइंटर को टाइप के बाद अगले पते पर ले जाता है।
यदि आप किसी पॉइंटर पर 4 बाइट फ़्लोट पर +1 करते हैं, तो पता 4 बाइट ऊपर चला जाएगा।
यदि आप 8 बाइट डबल के पॉइंटर पर +1 करते हैं, तो यह 8 बाइट बढ़ जाएगा।

यह समझने के लिए कि दो जातियाँ क्यों हैं, आपको कोष्ठकों को देखना होगा।
चार में कास्टिंग आमतौर पर इसलिए की जाती है क्योंकि यह किसी भी सूचक अंकगणित को गिनने के लिए आकार के रूप में ‘1’ का उपयोग करता है।

इसलिए पीटीआर को एक चार के रूप में मानें और फिर एक इंट के आकार का 2 गुना जोड़ें (जो कि डिफ़ॉल्ट रूप से 32 या 64 बिट सिस्टम में 4 होगा)। इसका मतलब यह है कि आप पीटीआर से हटाए गए 8 बाइट्स को पढ़ने का प्रयास करते हैं।
इसे लिखने का एक बहुत ही सरल तरीका होगा

*((int *)ptr + 2)

या यदि ptr पहले से ही int* प्रकार का है, तो बस ऐसा करें

*(ptr + 2)

コメント

タイトルとURLをコピーしました