2016-08-12 10 views
5

निर्माण unqlite ग पुस्तकालय में मैं निम्नलिखित कोड मिला: जहां pVm हैपता

pObj = jx9VmReserveMemObj(&(*pVm),&nIdx); 

:

typedef struct jx9_vm jx9_vm; 
jx9_vm *pVm 

और समारोह कहा जाता है के रूप में घोषित किया जाता है:

jx9_value * jx9VmReserveMemObj(jx9_vm *, sxu32 *); 

&(*pVm) निर्माण के लिए क्या है pVm के बजाय कॉल में इस्तेमाल किया गया? &(*pVm)pVm के बराबर है?

+2

मैं उपयोग करने के लिए 'और (* PVM)' 'PVM से अधिक का कोई कारण नहीं देख सकते हैं '। – haccks

+0

@ haccks मैंने अपने उत्तर में एक (सामान्य) एक का उल्लेख किया। :) –

उत्तर

7

C11, अध्याय §6.5.3.2, पता और अविवेक ऑपरेटरों

[...] संकार्य एक एकल * ऑपरेटर का परिणाम है, है न कि ऑपरेटर है और न ही हवाला देते हुए & ऑपरेटर का मूल्यांकन किया गया है और नतीजा यह है कि छोड़े गए थे, सिवाय इसके कि ऑपरेटरों पर बाधाएं अभी भी लागू होती हैं और परिणाम एक अंतराल नहीं है। [...]

तो, हाँ, वे बराबर हैं।

हालांकि, इस निर्माण का उपयोग पॉइंटर प्रकार के खिलाफ तर्क के प्रकार की जांच करने के लिए किया जा सकता है। एकल * ऑपरेटर की संपत्ति, से

एकल * ऑपरेटर के संकार्य सूचक प्रकार होगा।

तो, निर्माण &(*pVm)

  • , ठीक हो जाएगा अगर pvm एक सूचक या सरणी नाम है।
  • संकलक त्रुटि उत्पन्न करेगा, यदि pvm एक गैर-सूचक प्रकार चर है।

कोड-वार उदाहरण के लिए the other answer by Alter Mann देखें।

एक और अंतर (सामान्य में ) pVmसौंपा जा सकता है (असाइनमेंट ऑपरेटर की एलएचएस रूप में इस्तेमाल किया जा सकता है), है, लेकिन &(*pVm) नहीं कर सकता।

+2

"* तो, अंतर ... *" जो ओपी के उदाहरण के संदर्भ में कोई फर्क नहीं पड़ता। – alk

+0

@ सौरव धन्यवाद! – shibormot

+1

@alk बहुत अच्छी तरह से, लेकिन _maybe_ अन्य उपयोग और _this_ विशेष प्रोजेक्ट उस प्रोजेक्ट के लिए कोडिंग मानक वर्दी रखने के लिए हो सकता है। यद्यपि आवश्यक अस्वीकरण जोड़ा गया। ;) –

4

pVm के बराबर है?

हां। * 1

*(&pVm) के लिए समान।


(* 1) * -operator के रूप में (de-संदर्भित) केवल संकेत के लिए लागू है, पूर्व निर्माण केवल एक सूचक (या एक सरणी है, जो होगा पर काम करता है अपने पहले तत्व के लिए एक सूचक को क्षय)। उत्तरार्द्ध किसी भी प्रकार के चर पर लागू किया जा सकता है।:

2

हाँ, वे एक ही हैं, लेकिन लगता है कि यह विफल रहता है जब वस्तु एक सरणी या एक सूचक नहीं है:

#include <stdio.h> 

struct t { 
    int value; 
}; 

typedef struct t t; 

int func(t *ptr) 
{ 
    return ptr->value; 
} 

int main(void) 
{ 
    t o = {.value = 0}; 
    t v[2] = {{.value = 1}, {.value = 2}}; 

    printf("%d\n", func(&(*o))); /* error: invalid type argument of unary ‘*’ */ 
    printf("%d\n", func(&(*v))); /* WORKS */ 
    return 0; 
} 
+0

महोदय, आशा है कि आप मुझे अपने जवाब में एक लिंक डालने पर ध्यान नहीं देंगे। :) –

+0

कोई समस्या नहीं सौरव;) –

संबंधित मुद्दे