C ++ में मैं ऐसा क्यों कर सकता हूं? (जावास्क्रिप्ट या PHP के विपरीत)
int matrix[100][100], ar[100];
//...reading the matrix...
ar = matrix[0];
मुझे अपेक्षा होगी ar
शामिल करने के लिए matrix[0][0]
, matrix[0][1]
...matrix[0][100]
। इसके बजाय, यह सिर्फ मुझे एक स्मृति पता देता है। क्यों यह काम नहीं करता है (क्या है कि सी ++ में सटीक विशेषता नहीं है, क्या इसके कोई नुकसान / फायदे हैं? कौन सा?) और मैं इस व्यवहार को कैसे दोहरा सकता हूं या कम से कम एक ही कार्य कर सकता हूं। (बिना लूप और कॉपी के)
उत्तर:
जवाब के लिए 0 № 1जब आप किसी सरणी से एक सीमा को हटाते हैं, तो आपको एक अप्रत्यक्ष या सूचक के साथ छोड़ दिया जाता है।
इसलिए:
int matrix[100][100], *ar;
// ... doing stuff ...
ar = matrix[0];
काम करेगा।
मैट्रिक्स [x] [y] -> एक int है
मैट्रिक्स [x] -> एक इंट का सूचक है (या आप उस पते पर शुरू होने वाले इन्ट्स की एक सरणी कह सकते हैं)
आप मैट्रिक्स में किसी भी स्थान पर शुरू करने के लिए भी आरंभीकृत कर सकते हैं:
ar = &matrix[39][22]; //eg.
उत्तर № 2 के लिए 1
C ++ असाइनमेंट (operator =
) मान द्वारा कार्य करता है, अन्य भाषाएं, जैसे कि php और जावास्क्रिप्ट संदर्भ द्वारा निर्दिष्ट होती हैं।
आप जो चाहते हैं उसे करने के लिए, आपको संकेत के साथ काम करने की आवश्यकता है:
int matrix[100][100]; // As a pointer, this can be seen as int **
int *row;
row = matrix[0];
int value = row[50];
जवाब के लिए 0 № 3
C ++ में मैं ऐसा कुछ क्यों कर सकता हूं?
क्योंकि आप वास्तव में किसी भी सी ++ सुविधा का उपयोग नहीं कर रहे हैं। आपको उपयोग करना चाहिए std::array
जो आपके लिए कॉपी सिमेंटिक प्रदान करेगा:
std::array<std::array<int, 100>, 100> matrix;
auto ar = matrix[0];
हालाँकि, आपको इस बारे में पता होना चाहिए कि यह एक प्रतिलिपि बना देगा। यदि आप किसी विशेष एरे को एक्सेस करना चाहते हैं, तो आप इसके बजाय एक कॉन्स्ट / नॉन-कॉस्ट रेफरेंस का उपयोग कर सकते हैं:
std::array<std::array<int, 100>, 100> matrix;
const auto& ar = matrix[0];
जवाब के लिए 0 № 4
ar
प्रकार है int[100]
। किसी भी अभिव्यक्ति में (छोड़कर) sizeof ar
तथा &ar
) यह करने के लिए क्षय होगा int *
। तथा matrix
का क्षय होगा int (*)[100]
। तो, आप "बस इन संकेत दे सकते हैं।
आप उन्हें संशोधित नहीं कर सकते, लेकिन आप उनके पते ले सकते हैं (यह सरणी के पते के बराबर होगा)।
और एक और बात: वास्तव में, ये पॉइंटर हमेशा मेमोरी में मौजूद नहीं होते हैं। और क्षय सरणी का पता सरणी के पते के बराबर होगा और इसका पता पहला तत्व होगा।
int arr[10]{};
std::cout << (int)arr << "t" << &arr << "n"; // 0x0001bfcd 0x0001bfcd
std::cout << (int)arr[0] << "t" << &arr[0] << "n"; // 0 0x0001bfcd
जवाब के लिए 0 № 5
इसके बजाय, यह सिर्फ मुझे एक स्मृति पता देता है।
यह सही है: मैट्रिक्स [0] एक है सूचक 100 आरटी की एक सरणी के लिए, जबकि गिरफ्तारी है पता 100 ints की एक सरणी। आप एक घोषित पॉइंटर को एक पता दे सकते हैं, लेकिन आप एक घोषित पते पर एक पॉइंटर, घोषित या निहित नहीं दे सकते। वास्तविक कोड
ar = matrix[0]
आपको "असाइनमेंट में असंगत प्रकार" की तर्ज पर एक संकलन त्रुटि मिलनी चाहिए।
क्यों यह काम नहीं करता है
काम से आपका क्या मतलब है? आप क्या करना चाहते हैं?
यदि आप मैट्रिक्स की एक विशेष "पंक्ति" को संबोधित करना चाहते हैं, जैसे पंक्ति # 0, तो आप ऐसा कर सकते हैं
int *ar;
ar = matrix[0];
और फिर सरणी में किसी विशेष सेल तक पहुंचने के लिए सबस्क्रिप्ट सिंटैक्स का उपयोग करें
ar[50] = 42; // same as matrix[0][50] = 42
(बिना लूप और कॉपी के)
सरणियों की प्रतियों को छोरों की आवश्यकता होती है।