একটি অ্যারের নাম কি পয়েন্টার?


203

একটি অ্যারের নামটি কি সি তে পয়েন্টার হয়? যদি তা না হয় তবে অ্যারের নাম এবং পয়েন্টার ভেরিয়েবলের মধ্যে পার্থক্য কী?


4
নং তবে অ্যারে একই এবং অ্যারে [0]

36
@pst: &array[0]একটি পয়েন্টার দেয়, অ্যারে নয়;)
জাল্ফ

28
@ নাভা (এবং পিএসটি): অ্যারে এবং & অ্যারে [0] সত্যিই এক নয়। ক্ষেত্রে বিন্দু: আকার (অ্যারে) এবং মাপের (& অ্যারে [0]) বিভিন্ন ফলাফল দেয়।
টমাস প্যাড্রন-ম্যাকার্থি

1
@ থমাস সম্মত হন, তবে পয়েন্টারের ক্ষেত্রে আপনি যখন অ্যারে এবং & অ্যারে [0] কে অবজ্ঞা করেন, তখন তারা অ্যারের সমান মান তৈরি করে [0] .ie * অ্যারে == অ্যারে [0]। কারও অর্থ এই নয় যে এই দুটি পয়েন্টার একই, তবে এই নির্দিষ্ট ক্ষেত্রে (প্রথম উপাদানটির দিকে ইঙ্গিত করে) আপনি অ্যারের নামটিও ব্যবহার করতে পারেন।
নাভা কারমন

1
এগুলি আপনার বোঝার ক্ষেত্রেও সহায়তা করতে পারে: স্ট্যাকওভারফ্লো / প্রশ্নগুলি
দিনাহ

উত্তর:


255

একটি অ্যারে একটি অ্যারে এবং একটি পয়েন্টারটি পয়েন্টার হয় তবে বেশিরভাগ ক্ষেত্রে অ্যারের নামগুলি পয়েন্টারে রূপান্তরিত হয়। একটি শব্দ প্রায়শই ব্যবহৃত হয় এটি পয়েন্টারগুলিতে ক্ষয় হয়।

এখানে একটি অ্যারে রয়েছে:

int a[7];

a সাতটি পূর্ণসংখ্যার জন্য স্থান রয়েছে এবং আপনি এ্যাসাইনমেন্ট সহ এর মধ্যে একটিতে একটি মান রাখতে পারেন:

a[3] = 9;

এখানে একটি পয়েন্টার রয়েছে:

int *p;

pপূর্ণসংখ্যার জন্য কোনও স্থান নেই, তবে এটি কোনও পূর্ণসংখ্যার জন্য কোনও স্থানকে নির্দেশ করতে পারে। উদাহরণস্বরূপ, আমরা এটিকে অ্যারেতে যে কোনও একটি জায়গায় চিহ্নিত করতে পারি a, যেমন প্রথমটি:

p = &a[0];

বিভ্রান্তিকর কি হতে পারে আপনি এটি লিখতে পারেন যে:

p = a;

এই আছে না অ্যারের বিষয়বস্তু কপি aপয়েন্টার মধ্যে p(যাই হোক না কেন তার মানে হবে)। পরিবর্তে, অ্যারের নামটিকে aতার প্রথম এলিমেন্টে পয়েন্টারে রূপান্তর করা হয়। সুতরাং যে নিয়োগটি পূর্ববর্তী হিসাবে একই কাজ করে।

আপনি এখন pঅ্যারের মতো একইভাবে ব্যবহার করতে পারেন :

p[3] = 17;

যে কারণে এটি কাজ করে তা হ'ল সিটিতে অ্যারে ডিरेফারেন্সিং অপারেটরটি [ ]পয়েন্টারগুলির ক্ষেত্রে সংজ্ঞায়িত করা হয়। x[y]মাধ্যম: পয়েন্টার দিয়ে শুরু xপদক্ষেপ, yকি পয়েন্টার পয়েন্ট পরে উপাদান এগিয়ে, এবং তারপর নিতে যাই হোক না কেন নেই। পয়েন্টার গাণিতিক সিনট্যাক্স ব্যবহার করে, x[y]হিসাবেও লেখা যেতে পারে *(x+y)

এই যেমন আমাদের যেমন একটি স্বাভাবিক অ্যারে সঙ্গে কাজ করার জন্য a, নাম aমধ্যে a[3]অবশ্যই প্রথমে একটি পয়েন্টার (প্রথম উপাদানে রূপান্তরিত করা a)। তারপরে আমরা 3 টি উপাদানকে এগিয়ে নিয়ে যাই এবং যা আছে তা নিয়ে যাই। অন্য কথায়: উপাদানটিকে অ্যারেতে 3 পজিশনে নিন। (অ্যারের মধ্যে চতুর্থ উপাদান কোনটি, যেহেতু প্রথমটির সংখ্যাটি 0 হয়)

সুতরাং, সংক্ষেপে, একটি সি প্রোগ্রামের অ্যারের নামগুলি (বেশিরভাগ ক্ষেত্রে) পয়েন্টারে রূপান্তরিত হয়। একটি ব্যতিক্রম হ'ল আমরা যখন sizeofঅ্যারেতে অপারেটরটি ব্যবহার করি । যদি aএই প্রসঙ্গে পয়েন্টারে রূপান্তর করা হয় তবে পয়েন্টারটির sizeof aআকার দেবে এবং প্রকৃত অ্যারে নয়, যা অকেজো হবে, সুতরাং সেই ক্ষেত্রে aঅ্যারে নিজেই বোঝায়।


5
একই ধরণের স্বয়ংক্রিয় রূপান্তরটি ফাংশন পয়েন্টারগুলিতে প্রয়োগ করা হয় - উভয়ই functionpointer()এবং (*functionpointer)()একই জিনিসটির অর্থ, আশ্চর্যের সাথে যথেষ্ট।
কার্ল নরুম

3
তিনি জিজ্ঞাসা করেননি যে অ্যারে এবং পয়েন্টারগুলি একই কিনা, তবে যদি অ্যারের নাম পয়েন্টার হয়
রিকার্ডো আমোরস

32
একটি অ্যারের নাম পয়েন্টার নয়। এটি টাইপ অ্যারেরের একটি ভেরিয়েবলের জন্য একটি শনাক্তকারী, যা উপাদান টাইপের বিন্দুতে অন্তর্ভুক্ত রূপান্তর করে convers
পাভেল মিনায়েভ

29
এছাড়াও, বাদে sizeof(), অন্যান্য প্রসঙ্গ যেখানে কোন অ্যারে-> পয়েন্টার ক্ষয় নেই অপারেটর &- উপরে আপনার উদাহরণে, &a7 এর অ্যারে পয়েন্টার হবে, একটি বিন্দুতে intনয় int; অর্থাৎ, এর প্রকারটি হবে int(*)[7], যা রূপান্তরিত নয় int*। এইভাবে, ফাংশনগুলি নির্দিষ্ট আকারের অ্যারেগুলিতে পয়েন্টার নিতে পারে এবং টাইপ সিস্টেমের মাধ্যমে সীমাবদ্ধতা প্রয়োগ করতে পারে।
পাভেল মিনায়েভ

3
@ onmyway133, একটি সংক্ষিপ্ত ব্যাখ্যা এবং আরও উদ্ধৃতি দেওয়ার জন্য এখানে চেক করুন
কার্ল নরম

36

একটি অ্যারে যখন মান হিসাবে ব্যবহৃত হয়, এর নামটি প্রথম উপাদানটির ঠিকানা উপস্থাপন করে।
যখন কোনও অ্যারে মান হিসাবে ব্যবহৃত হয় না তখন এর নামটি পুরো অ্যারে উপস্থাপন করে।

int arr[7];

/* arr used as value */
foo(arr);
int x = *(arr + 1); /* same as arr[1] */

/* arr not used as value */
size_t bytes = sizeof arr;
void *q = &arr; /* void pointers are compatible with pointers to any object */

20

যদি অ্যারের ধরণের একটি এক্সপ্রেশন (যেমন অ্যারের নাম) বৃহত্তর এক্সপ্রেশনতে উপস্থিত হয় এবং এটি অপারেটর &বা sizeofঅপারেটরগুলির না হয় তবে অ্যারের এক্সপ্রেশনটির ধরণটি "এন-এলিমেন্ট অ্যারে" টি তে রূপান্তরিত হয় "টি-তে পয়েন্টার" এবং অভিব্যক্তির মান হ'ল অ্যারেতে প্রথম উপাদানটির ঠিকানা।

সংক্ষেপে, অ্যারের নামটি কোনও পয়েন্টার নয়, তবে বেশিরভাগ প্রসঙ্গে এটির সাথে বিবেচনা করা হয় যেন এটি পয়েন্টার ছিল।

সম্পাদন করা

মন্তব্যে প্রশ্নের উত্তর:

আমি যদি মাপের ব্যবহার করি তবে আমি কি অ্যারের উপাদানগুলির আকারটি গণনা করব? তারপরে অ্যারে "হেড" দৈর্ঘ্য এবং একটি পয়েন্টার সম্পর্কিত তথ্য নিয়েও স্থান নেয় (এবং এর অর্থ এটি একটি সাধারণ পয়েন্টারের চেয়ে আরও বেশি জায়গা নেয়)?

আপনি যখন একটি অ্যারে তৈরি করেন, কেবলমাত্র বরাদ্দকৃত উপাদানটি তাদের উপাদানগুলির জন্য স্থান; কোনও স্টোরেজ পৃথক পয়েন্টার বা কোনও মেটাডেটার জন্য কার্যকর করা হয় না। প্রদত্ত

char a[10];

স্মৃতিতে যা পাবেন তা হ'ল

   +---+
a: |   | a[0]
   +---+ 
   |   | a[1]
   +---+
   |   | a[2]
   +---+
    ...
   +---+
   |   | a[9]
   +---+

অভিব্যক্তি a সম্পূর্ণ অ্যারে উল্লেখ করে, কিন্তু কোন ব্যাপার বস্তুর a অ্যারে উপাদানের নিজেদের থেকে আলাদা। সুতরাং, sizeof aআপনাকে পুরো অ্যারের আকার দেয় (বাইটে)। এক্সপ্রেশন &aআপনাকে অ্যারের ঠিকানা দেয় যা প্রথম উপাদানটির ঠিকানার মতো । মধ্যে পার্থক্য &aএবং &a[0]ফলাফলের প্রকার 1 - char (*)[10]প্রথম ক্ষেত্রে এবং char *সেকেন্ডের মধ্যে।

জিনিসগুলি যখন অদ্ভুত হয়ে যায় তখন আপনি পৃথক উপাদানগুলিতে অ্যাক্সেস করতে চান - এক্সপ্রেশনটি a[i]ফলাফল হিসাবে সংজ্ঞায়িত হয় *(a + i)- কোনও ঠিকানা মান দেওয়া হয় a, সেই ঠিকানা থেকে iউপাদানগুলি অফসেট ( বাইট নয় ) এবং ফলাফলটিকে অবলম্বন করে।

সমস্যাটি হ'ল এটি aকোনও পয়েন্টার বা ঠিকানা নয় - এটি সম্পূর্ণ অ্যারে অবজেক্ট। সুতরাং, সি-র নিয়মটি যখনই সংকলক অ্যারে টাইপের একটি এক্সপ্রেশন দেখায় (যেমন a, যা টাইপ করে char [10]) এবং সেই অভিব্যক্তিটি sizeofঅ্যানারি &অপারেটরদের অপরেন্ড নয় , তখন সেই অভিব্যক্তির ধরণটি রূপান্তরিত হয় ("ডেসে") একটি পয়েন্টার টাইপ ( char *) এবং এক্সপ্রেশনটির মান হ'ল অ্যারের প্রথম উপাদানটির ঠিকানা। অতএব, অভিব্যক্তিটির মত প্রকাশের মত a একই ধরণের এবং মান থাকে &a[0](এবং এক্সটেনশন দ্বারা, এক্সপ্রেশন *aহিসাবে এক্সপ্রেশন হিসাবে একই ধরণের এবং মান থাকে a[0])।

সি আগের বি নামক ভাষা থেকে উদ্ভূত হয়, এবং 'বি' a ছিল অ্যারে উপাদান থেকে আলাদা পয়েন্টার বস্তুর a[0], a[1]ইত্যাদি রিচি খ এর অ্যারে শব্দার্থবিদ্যা রাখতে চেয়েছিলেন, কিন্তু পৃথক পয়েন্টার বস্তুর সংরক্ষণকারী সঙ্গে জগাখিচুড়ি চায়নি। তাই সে এ থেকে মুক্তি পেল। পরিবর্তে, সংকলক প্রয়োজন অনুসারে অনুবাদকালে অ্যারে এক্সপ্রেশনগুলিকে পয়েন্টার এক্সপ্রেশনগুলিতে রূপান্তর করবে।

মনে রাখবেন যে আমি বলেছিলাম অ্যারেগুলি তাদের আকার সম্পর্কে কোনও মেটাডেটা সঞ্চয় করে না। এই অ্যারে এক্সপ্রেশনটি পয়েন্টারের কাছে "ক্ষয়" হওয়ার সাথে সাথে আপনার সমস্ত কিছুই একক উপাদানের পয়েন্টার। সেই উপাদানটি উপাদানগুলির ক্রমের প্রথম হতে পারে, বা এটি কোনও একক বস্তু হতে পারে। পয়েন্টারের উপর ভিত্তি করে জানার কোনও উপায় নেই।

যখন আপনি কোনও ফাংশনে অ্যারে এক্সপ্রেশনটি পাস করেন, সমস্ত ক্রিয়াকলাপটি প্রথম উপাদানটির জন্য একটি পয়েন্টার হয় - অ্যারেটি কত বড় তা কোনও ধারণা নেই (এই কারণেই getsফাংশনটি এমন একটি মারাত্মক ঘটনা ছিল এবং শেষ পর্যন্ত লাইব্রেরি থেকে সরানো হয়েছিল)। অ্যারেতে কতগুলি উপাদান রয়েছে তা জানার জন্য আপনাকে অবশ্যই একটি সেন্ডিনেল মান (যেমন সি স্ট্রিংগুলিতে 0 টার্মিনেটর) ব্যবহার করতে হবে বা আপনাকে পৃথক প্যারামিটার হিসাবে উপাদানগুলির সংখ্যাটি অবশ্যই পাস করতে হবে।


  1. ঠিকানা * কীভাবে ব্যাখ্যা করা যায় তা * প্রভাবিত করতে পারে - এটি মেশিনের উপর নির্ভর করে।

এই উত্তরের জন্য অনেক দিন ধরে খুঁজছিলেন। ধন্যবাদ! এবং যদি আপনি জানেন, আপনি কি অ্যারে এক্সপ্রেশনটি কী তা আরও কিছুটা বলতে পারেন। আমি যদি মাপের ব্যবহার করি তবে আমি কি অ্যারের উপাদানগুলির আকারটি গণনা করব? তারপরে অ্যারে "হেড" দৈর্ঘ্য এবং একটি পয়েন্টার সম্পর্কিত তথ্য নিয়েও স্থান নেয় (এবং এর অর্থ এটি একটি সাধারণ পয়েন্টারের চেয়ে আরও বেশি জায়গা নেয়)?
অ্যান্ড্রি ডাইম্যাট্রুক

এবং আরও একটি জিনিস। 5 দৈর্ঘ্যের একটি অ্যারে টাইপ হয় [5]। সুতরাং এটি সেখান থেকে আমরা যখন দৈর্ঘ্যটি জানি যখন আকারের (অ্যারে) কল করি - এর প্রকার থেকে? এবং এর অর্থ হ'ল বিভিন্ন দৈর্ঘ্যের অ্যারেগুলি বিভিন্ন ধরণের ধ্রুবকের মতো?
Andriy Dmytruk

@ অ্যান্ড্রিডমিট্রিক: sizeofঅপারেটর এবং এটি অপারেন্ডের সংখ্যা বাইটগুলিতে মূল্যায়ন করে (হয় কোনও পদার্থকে চিহ্নিত করে এমন একটি অভিব্যক্তি, বা বন্ধনীতে কোনও প্রকারের নাম)। সুতরাং, একটি অ্যারের জন্য, sizeofএকক উপাদানের বাইট সংখ্যা দ্বারা গুণিত উপাদানের সংখ্যাকে মূল্যায়ন করে। যদি কোনও int4 বাইট প্রশস্ত হয়, তবে 5-এলিমেন্টের অ্যারে int20 বাইট নেয় takes
জন বোদে

অপারেটরও কি [ ]বিশেষ নয়? উদাহরণস্বরূপ, int a[2][3];তারপরে x = a[1][2];, যদিও এটি আবার লিখতে পারা যায় x = *( *(a+1) + 2 );, এখানে aএকটি পয়েন্টার টাইপে রূপান্তরিত হয় না int*(যদিও aকোনও ফাংশনের যুক্তি হলে এটি রূপান্তর করা উচিত int*)।
স্টান

2
@ স্ট্যান: এক্সপ্রেশনটির aটাইপ থাকে int [2][3], যা টাইপ করতে "সিদ্ধান্ত নেয়" int (*)[3]। এক্সপ্রেশনটির *(a + 1)ধরন রয়েছে int [3]যা "সিদ্ধান্ত নেয়" int *। সুতরাং, *(*(a + 1) + 2)টাইপ হবে intaপ্রথম 3-উপাদানের বিন্যাস পয়েন্ট int, a + 1দ্বিতীয় 3-উপাদানের বিন্যাস পয়েন্ট int, *(a + 1) হয় দ্বিতীয় 3-উপাদানের বিন্যাস int, *(a + 1) + 2দ্বিতীয় অ্যারের তৃতীয় উপাদান পয়েন্ট int, তাই *(*(a + 1) + 2) হয় দ্বিতীয় অ্যারের তৃতীয় উপাদান int। এটি কীভাবে মেশিন কোডে ম্যাপ করা যায় তা সম্পূর্ণরূপে সংকলকটির উপর নির্ভর করে।
জন বোদে

5

একটি অ্যারে এভাবে ঘোষিত হয়েছে

int a[10];

10 টির জন্য মেমরি বরাদ্দ করে int। আপনি সংশোধন করতে পারবেন না aতবে আপনি পয়েন্টার গাণিতিকটি করতে পারেন a

এই জাতীয় পয়েন্টার কেবলমাত্র পয়েন্টারের জন্য মেমরি বরাদ্দ করে p:

int *p;

এটি কোনও intএস বরাদ্দ করে না । আপনি এটি পরিবর্তন করতে পারেন:

p = a;

এবং অ্যারে সাবস্ক্রিপ্টগুলি আপনি এটির সাথে ব্যবহার করতে পারেন:

p[2] = 5;
a[2] = 5;    // same
*(p+2) = 5;  // same effect
*(a+2) = 5;  // same effect

2
অ্যারে সবসময় স্ট্যাকের জন্য বরাদ্দ করা হয় না। ইয়াহট এর একটি বাস্তবায়ন বিশদ যা সংকলক থেকে সংকলক থেকে পৃথক হবে। বেশিরভাগ ক্ষেত্রে স্থির বা গ্লোবাল অ্যারেগুলি স্ট্যাকের চেয়ে আলাদা মেমরি অঞ্চল থেকে বরাদ্দ করা হবে। কনস্টের ধরণের অ্যারেগুলি মেমরির অন্য একটি অঞ্চল থেকে বরাদ্দ করা যেতে পারে
মার্ক বেসি

1
আমি মনে করি Grumdrig বলতে "বরাদ্দ 10 বোঝানো intস্বয়ংক্রিয় স্টোরেজ duration` সঙ্গে সে।
কক্ষপথে লঘিমা জাতি

4

অ্যারের নাম নিজে থেকেই একটি স্মৃতি অবস্থান দেয়, তাই আপনি অ্যারের নামটিকে পয়েন্টারের মতো আচরণ করতে পারেন:

int a[7];

a[0] = 1976;
a[1] = 1984;

printf("memory location of a: %p", a);

printf("value at memory location %p is %d", a, *a);

এবং অন্যান্য নিফটি স্টাফগুলি যা আপনি পয়েন্টারটিতে করতে পারেন (উদাঃ একটি অফসেট যোগ / বিয়োগ), আপনি একটি অ্যারেও করতে পারেন:

printf("value at memory location %p is %d", a + 1, *(a + 1));

ভাষাভিত্তিক, সি যদি বিন্যাসটিকে কিছু প্রকারের "পয়েন্টার" হিসাবে প্রকাশ না করে (প্যাডেন্টালি এটি কেবল একটি মেমরির অবস্থান। এটি স্মৃতিতে স্বেচ্ছাসেবী অবস্থানকে নির্দেশ করতে পারে না বা প্রোগ্রামার দ্বারা নিয়ন্ত্রণ করা যায় না)। আমাদের সর্বদা এটি কোড করা প্রয়োজন:

printf("value at memory location %p is %d", &a[1], a[1]);

1

আমি মনে করি এই উদাহরণটি এই বিষয়ে কিছুটা আলোকপাত করেছে:

#include <stdio.h>
int main()
{
        int a[3] = {9, 10, 11};
        int **b = &a;

        printf("a == &a: %d\n", a == b);
        return 0;
}

এটি জিসিসি ৪.৯.২ এ জরিমানা (২ টি সতর্কতা সহ) সংকলন করে এবং নিম্নলিখিতগুলি মুদ্রণ করে:

a == &a: 1

উফ :-)

সুতরাং, উপসংহারটি হ'ল না, অ্যারেটি কোনও পয়েন্টার নয়, এটি পয়েন্টার হিসাবে মেমরির মধ্যে সংরক্ষণ করা হয় না (কেবলমাত্র পঠনযোগ্য একও নয়) যদিও এটি দেখতে মনে হচ্ছে, যেহেতু আপনি & অপারেটরের সাথে তার ঠিকানাটি পেতে পারেন । তবে - ওফ - সেই অপারেটর কাজ করে না :-)), কোনওভাবেই আপনাকে সতর্ক করা হয়েছে:

p.c: In function main’:
pp.c:6:12: warning: initialization from incompatible pointer type
  int **b = &a;
            ^
p.c:8:28: warning: comparison of distinct pointer types lacks a cast
  printf("a == &a: %d\n", a == b);

সি ++ সংকলন-সময় ত্রুটিযুক্ত এই জাতীয় কোনও প্রচেষ্টা প্রত্যাখ্যান করে।

সম্পাদনা:

এই আমি বোঝাতে চেয়েছিলাম:

#include <stdio.h>
int main()
{
    int a[3] = {9, 10, 11};
    void *c = a;

    void *b = &a;
    void *d = &c;

    printf("a == &a: %d\n", a == b);
    printf("c == &c: %d\n", c == d);
    return 0;
}

যদিও cএবং aএকই মেমরি "নির্দেশ", আপনি এর ঠিকানা পেতে পারেন cপয়েন্টার, কিন্তু আপনি এর ঠিকানা প্রাপ্ত করতে পারবেন না aপয়েন্টার।


1
"এটি সূক্ষ্ম সংকলন করে (২ টি সতর্কতা সহ)"। এটা ঠিক নেই। আপনি যদি জিসিিকে যোগ করে যথাযথ মান সি হিসাবে সংকলন করতে বলেন -std=c11 -pedantic-errors, আপনি অবৈধ সি কোড লেখার জন্য একটি সংকলক ত্রুটি পান। এর কারণ হ'ল কারণ আপনি int (*)[3]একটি ভেরিয়েবলের জন্য একটি নির্ধারণ করার চেষ্টা করেন int**যা দুটি ধরণের যা একে অপরের সাথে একেবারে কিছুই করার নেই। সুতরাং এই উদাহরণটি যা প্রমাণ করার কথা, সে সম্পর্কে আমার কোনও ধারণা নেই।
লন্ডিন

আপনার মন্তব্যের জন্য আপনাকে লন্ডিন ধন্যবাদ। আপনি জানেন অনেক মান আছে। আমি সম্পাদনা বলতে কী বোঝাতে চাইছি তা পরিষ্কার করার চেষ্টা করেছি। int **টাইপ বিন্দু নেই, এক ভাল ব্যবহার করা উচিত void *এই জন্য।
পলো

-3

অ্যারের নামটি পয়েন্টারের মতো আচরণ করে এবং অ্যারের প্রথম উপাদানটিকে নির্দেশ করে। উদাহরণ:

int a[]={1,2,3};
printf("%p\n",a);     //result is similar to 0x7fff6fe40bc0
printf("%p\n",&a[0]); //result is similar to 0x7fff6fe40bc0

মুদ্রণ বিবৃতি উভয়ই একটি মেশিনের জন্য ঠিক একই আউটপুট দেবে। আমার সিস্টেমে এটি দিয়েছে:

0x7fff6fe40bc0

-4

একটি অ্যারের স্মৃতিতে সিক্যুয়াল এবং সংযুক্ত উপাদানগুলির একটি সংগ্রহ। সি-তে একটি অ্যারের নাম হ'ল প্রথম উপাদানটির সূচক এবং অফসেট প্রয়োগ করে আপনি বাকী উপাদানগুলিতে অ্যাক্সেস করতে পারেন। একটি "প্রথম উপাদান সূচক" প্রকৃতপক্ষে একটি মেমরি দিকের নির্দেশক।

পয়েন্টার ভেরিয়েবলের সাথে পার্থক্য হ'ল আপনি অ্যারের নামটি নির্দেশ করছেন যে অবস্থানটি পরিবর্তন করতে পারবেন না তাই কনস্ট পয়েন্টারের অনুরূপ (এটি একইরকম, একই নয়। মার্কের মন্তব্য দেখুন)। তবে আপনি যদি পয়েন্টার অ্যারিমেটিক ব্যবহার করেন তবে মানটি পেতে আপনার অ্যারের নামটি অবলম্বন করতে হবে না:

char array = "hello wordl";
char* ptr = array;

char c = array[2]; //array[2] holds the character 'l'
char *c1 = ptr[2]; //ptr[2] holds a memory direction that holds the character 'l'

উত্তরটি হ'ল 'হ্যাঁ'।


1
একটি অ্যারের নাম কনস্ট পয়েন্টার হিসাবে একই নয়। প্রদত্ত: int a [10]; int * p = a; আকার (পি) এবং মাপের (ক) এক নয়।
মার্ক বেসে

1
অন্যান্য পার্থক্য আছে। সাধারণভাবে, সি স্ট্যান্ডার্ড দ্বারা ব্যবহৃত পরিভাষাগুলি ধরে রাখা ভাল, যা এটিকে বিশেষত "রূপান্তর" বলে অভিহিত করে। উদ্ধৃতি: "এটি যখন আকারের অপারেটরের অপারেন্ড বা অ্যানারি ও অপারেটর, বা কোনও অ্যারে শুরু করার জন্য স্ট্রিং আক্ষরিক হয় তবে '' টাইপের ধরণের অ্যারে রয়েছে এমন একটি এক্সপ্রেশন 'টাইপের সাথে অভিব্যক্তিতে রূপান্তরিত হয় 'পয়েন্টার টু টাইপ' 'যা অ্যারে অবজেক্টের প্রাথমিক উপাদানটির দিকে নির্দেশ করে এবং লভ্যালু নয় If অ্যারে অবজেক্টটিতে স্টোরেজ ক্লাসটি নিবন্ধিত থাকলে, আচরণটি সংজ্ঞায়িত নয়। "
পাভেল মিনায়েভ

-5

অ্যারের নামটি একটি অ্যারের প্রথম উপাদানটির ঠিকানা। সুতরাং হ্যাঁ অ্যারের নামটি একটি কনস্ট পয়েন্টার।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.