2009-02-11 14 views
5

में पहले बाइट प्राप्त करना मेरे पास एक char * बफर है और मुझे char * buffer में पहले बाइट को देखने में दिलचस्पी है, इसके बारे में जाने का सबसे इष्टतम तरीका क्या है।char * buffer

संपादित करें: नकारात्मक वोटों के आधार पर मैं यह बताना चाहता हूं कि यह सवाल क्यों है, मैं विधियों से अवगत हूं लेकिन कोड बेस में जो मैं पहले बाइट लोगों को ढूंढने की तलाश में हूं, वे सभी प्रकार की पागल चीजें करते हैं जैसे प्रतिलिपि बफर का, इसे एक स्ट्रीम में कॉपी करें और फिर एक प्राप्त करें।

+0

यदि इष्टतम द्वारा आपका मतलब "सबसे तेज़" है, तो जोहान्स या जोश के उत्तर का उपयोग करें। सूक्ष्म अनुकूलन बेवकूफ है। –

+0

जोहान्स का जवाब वैसे भी इष्टतम है - यह एक एकल अनुक्रमित लोड सेशन में संकलित करता है। – Crashworks

+0

मैंने एक कंपाइलर नहीं देखा है जो पीएफ के दिनों से बफर [0] से अलग * बफर से अलग करता है। –

उत्तर

18

बस

char firstByte = buffer[0]; 
+1

लेकिन क्या यह इष्टतम है? यह एक पूरे चक्र की लागत है! ;) – Crashworks

+0

यदि बफर को बाहर निकाल दिया गया है तो यह और भी हो सकता है - यह सैकड़ों चक्र हो सकता है। बस सुनिश्चित करने के लिए, आपको शायद उस मेमोरी को रैम में लॉक करना चाहिए ताकि कोई पेजिंग न हो। – Eclipse

+0

यह सुनिश्चित करना संभव है कि कुछ मेमोरी पजेड न हो जाए? – Albert

13

या इस का उपयोग करें:

char firstByte = *buffer; 

स्पष्टीकरण के लिए, वहाँ, *buffer और buffer[0] बीच कोई अंतर नहीं है, क्योंकि बाद वास्तव में सिर्फ *(buffer + 0*sizeof(char)) के लिए आशुलिपि, और किसी भी संकलक है *(buffer+0) और फिर *buffer के साथ प्रतिस्थापित करने के लिए पर्याप्त स्मार्ट होने जा रहा है। तो पसंद वास्तव में जो भी आप इसका उपयोग कर रहे हैं उसमें स्पष्ट है, हर कोई कितना कुशल नहीं है।

1
char first = someCharPtr[0]; 

या

char first = *someCharPtr; 
5
char *buffer = {'h','e','l','l','o','\0'}; 

या:

char *buffer = "hello"; 

या:

char buffer[6] = {'h','e','l','l','o','\0'}; 

और पहली बाइट प्राप्त करने के लिए:

char firstChar = buffer[0]; 

या:

char firstChar = *buffer; // since the buffer pointer points to the first element in the array 
+0

{'एच', 'ई', 'एल', 'एल', 'ओ', '\ 0'} में छह तत्व हैं। – Chuck

+0

एहे, हाँ, बेवकूफ टाइपो। –

+0

char * buffer = "हैलो" के बीच काफी अंतर है; और चार बफर [] = "हैलो"; – Eclipse

2

आप सूक्ष्म अनुकूलन करने के लिए निर्धारित कर रहे हैं, आपको पता होना चाहिए कि इस सहस्राब्दी में किए गए हर संकलक के लिए वास्तव में एक ही मशीन कोड प्रस्तुत करना चाहिए "c = * बफर" और "सी = बफर [0]"।

+0

यहां तक ​​कि मेरा खिलौना वर्ग-प्रोजेक्ट कंपाइलर भी इस अनुकूलन कर सकता है;) – Eclipse

+0

चूंकि बफर [0] को * (बफर + 0 * आकार (char)) के रूप में परिभाषित किया गया है, यह मुश्किल अनुकूलन नहीं है। यह एक सीधा परिवर्तन है, इसके बाद थोड़ा सटीकता है। मैं सार्वजनिक रूप से उपलब्ध कंपाइलर पर चौंक गया हूं जो इसे याद करता है। –

0

86 प्लेटफार्मों के लिए अच्छा ...

char firstByte; 

__asm { 
    mov al, [buffer] 
    mov [firstByte], al 
} 
1
बस कई लोग क्या उल्लेख किया है की एक स्पष्टीकरण के रूप में

- कि:

buffer[0] 

*(buffer + 0*sizeof(char)) 

है कि के बराबर है तकनीकी रूप से सच नहीं है यदि आप मानते हैं कि इसका शाब्दिक सी कोड (यानी छद्म कोड नहीं है), हालांकि संकलक क्या है तुम्हारे लिए कर रहा है

सूचक अंकगणित की वजह से

, जब आप एक सूचक को एक पूर्णांक जोड़ने के लिए, यह स्वचालित रूप से sizeof(*pointer) से गुणा किया जाता है, तो यह वास्तव में होना चाहिए:

*(buffer + 0) 

हालांकि, sizeof(char) के बाद से 1 होने के लिए परिभाषित किया गया है, यह है वास्तव में इस मामले में समकक्ष।

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