দ্বিমাত্রিক অ্যারেতে একটি পয়েন্টার তৈরি করুন


119

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

static uint8_t l_matrix[10][20];

void test(){
   uint8_t **matrix_ptr = l_matrix; //wrong idea 
}

আমি সমস্ত ধরণের ত্রুটি পেয়েছি যেমন:

  • সতর্কতা: অসম্পূর্ণ পয়েন্টার ধরণের থেকে অ্যাসাইনমেন্ট
  • সাবস্ক্রিপ্ট করা মান আরে বা পয়েন্টার নয়
  • ত্রুটি: নমনীয় অ্যারে সদস্যের অবৈধ ব্যবহার


1
@ জোহানেস শ্যাব-লিটব এর অস্তিত্ব নেই। (আমি কীভাবে এটি আবার দেখতে পারি ...? আমি জানি যে নিম্ন-প্রতিনিধিরা এটিকে দেখতে পারে, তবে আমি কীভাবে ভুলে গিয়েছিলাম ...)
মতিন উলহাক

@ মন্টু: এটির একটি অনুলিপি এখানে রয়েছে: gist.github.com/sharth/ede13c0502d5dd8d45bd
বিল লিঞ্চ

উত্তর:


139

এখানে আপনি অ্যারের প্রথম উপাদানটির জন্য একটি পয়েন্টার তৈরি করতে চান

uint8_t (*matrix_ptr)[20] = l_matrix;

টাইপিডেফের সাথে এটি আরও পরিষ্কার দেখাচ্ছে

typedef uint8_t array_of_20_uint8_t[20];
array_of_20_uint8_t *matrix_ptr = l_matrix;

তাহলে আপনি আবার জীবন উপভোগ করতে পারেন :)

matrix_ptr[0][1] = ...;

সি-তে পয়েন্টার / অ্যারে ওয়ার্ল্ড সম্পর্কে সাবধান থাকুন , এ সম্পর্কে অনেকগুলি বিভ্রান্তি রয়েছে।


সম্পাদন করা

এখানে অন্যান্য কয়েকটি উত্তর পর্যালোচনা করা হচ্ছে, কারণ সেখানে মন্তব্য করার ক্ষেত্রগুলি খুব ছোট। একাধিক বিকল্প প্রস্তাব করা হয়েছিল, তবে তারা কীভাবে আচরণ করে তা দেখানো হয়নি। তারা কি করে তা এখানে

uint8_t (*matrix_ptr)[][20] = l_matrix;

যদি আপনি ত্রুটিটি ঠিক করে &থাকেন এবং নিম্নলিখিত স্নিপেটের মতো ঠিকানার অপারেটর যুক্ত করেন

uint8_t (*matrix_ptr)[][20] = &l_matrix;

তারপরে যে কোনওটি 20 uint8_t টাইপের অ্যারের উপাদানের অসম্পূর্ণ অ্যারে ধরণের একটি পয়েন্টার তৈরি করে। যেহেতু পয়েন্টারটি অ্যারেগুলিতে রয়েছে তাই আপনাকে এটির সাথে অ্যাক্সেস করতে হবে

(*matrix_ptr)[0][1] = ...;

এবং এটি একটি অসম্পূর্ণ অ্যারের নির্দেশক, আপনি শর্টকাট হিসাবে করতে পারবেন না

matrix_ptr[0][0][1] = ...;

কারণ সূচিকরণের জন্য উপাদান ধরণের আকার জানা প্রয়োজন (সূচকটি পয়েন্টারে একটি পূর্ণসংখ্যার সংযোজনকে বোঝায় তাই এটি অসম্পূর্ণ প্রকারের সাথে কাজ করবে না)। মনে রাখবেন এটি কেবলমাত্র কাজ করে C, কারণ T[]এবং T[N]এটি সামঞ্জস্যপূর্ণ প্রকারের। সি ++ এর সাথে সামঞ্জস্যপূর্ণ ধরণের ধারণা নেই এবং তাই এটি সেই কোডটিকে প্রত্যাখ্যান করবে, কারণ T[]এবং T[10]এটি বিভিন্ন ধরণের।


নিম্নলিখিত বিকল্পটি মোটেও কাজ করে না, কারণ অ্যারের উপাদানের ধরণটি যখন আপনি একে এক-মাত্রিক অ্যারে হিসাবে দেখেন তবে তা নয় uint8_t , তবেuint8_t[20]

uint8_t *matrix_ptr = l_matrix; // fail

নিম্নলিখিতটি একটি ভাল বিকল্প

uint8_t (*matrix_ptr)[10][20] = &l_matrix;

আপনি এটি দিয়ে অ্যাক্সেস

(*matrix_ptr)[0][1] = ...;
matrix_ptr[0][0][1] = ...; // also possible now

এটির সুবিধাটি এটি বাইরের মাত্রার আকার সংরক্ষণ করে। সুতরাং আপনি এটিতে আকার প্রয়োগ করতে পারেন

sizeof (*matrix_ptr) == sizeof(uint8_t) * 10 * 20

অন্য একটি উত্তর রয়েছে যা একটি অ্যারের আইটেমগুলি স্বচ্ছভাবে সংরক্ষণ করা হয় তা ব্যবহার করে

uint8_t *matrix_ptr = l_matrix[0];

এখন, এটি আনুষ্ঠানিকভাবে কেবল আপনাকে দ্বিমাত্রিক অ্যারের প্রথম উপাদানটির উপাদানগুলিতে অ্যাক্সেস করার অনুমতি দেয়। অর্থাৎ, নিম্নলিখিত শর্তটি ধরে রাখে

matrix_ptr[0] = ...; // valid
matrix_ptr[19] = ...; // valid

matrix_ptr[20] = ...; // undefined behavior
matrix_ptr[10*20-1] = ...; // undefined behavior

আপনি দেখতে পাবেন এটি সম্ভবত কার্যকরভাবে কাজ করে 10*20-1, তবে আপনি যদি উলাম বিশ্লেষণ এবং অন্যান্য আক্রমণাত্মক অপ্টিমাইজেশান ব্যবহার করেন তবে কিছু সংকলক এমন একটি ধারণা তৈরি করতে পারে যা সেই কোডটি ভেঙে দিতে পারে। এটি বলার পরে, আমি কখনই কোনও সংকলকের মুখোমুখি হইনি যা এতে ব্যর্থ হয় (তবে তারপরে, আমি সেই কৌশলটি আসল কোডে ব্যবহার করি নি), এমনকি সি এফকিউতেও সেই কৌশল রয়েছে (এর ইউবি'স সম্পর্কে সতর্কতা সহ) ), এবং আপনি যদি অ্যারের প্রকারটি পরিবর্তন করতে না পারেন তবে আপনাকে বাঁচানোর এটি একটি শেষ বিকল্প :)


+1 - ভাল তথ্য (*) [] [20] ব্রেকডাউন - সি ++ এ তা করতে পারে না
ফয়সাল ভালি

@ লিটব, আমি দুঃখিত তবে এটি ভুল কারণ আপনার সমাধান অ্যারের জন্য কোনও স্টোরেজ বরাদ্দ দেয় না।
রব ওয়েলস

2
@ রব, আমি আপনাকে বেশ বুঝতে পারি না। এই সমস্ত ক্ষেত্রে স্টোরেজটি অ্যারে l_matix নিজেই সরবরাহ করে। তাদের নির্দেশকরা সেখান থেকে স্টোরেজ নেয় যেখানেই এগুলি ঘোষণা করা হয় এবং হিসাবে (স্ট্যাক, স্ট্যাটিক ডেটা বিভাগ, ...)।
জোহানেস স্কাউব - লিটব

শুধু কৌতূহলী কেন আমাদের l_matrix এর "&" ঠিকানা প্রয়োজন?
বৈদ্যুতিন

1
@ সোহাইব - না, এটি কেবল একটি পয়েন্টার তৈরি করে। আপনি এটির সাথে বিভ্রান্ত হয়ে থাকতে পারেন uint8_t *d[20], যা uint8_t তে 3 পয়েন্টারের অ্যারে তৈরি করে, তবে এটি এই ক্ষেত্রে কাজ করবে না।
পালো

27

এটি পুরোপুরি বুঝতে, আপনাকে নিম্নলিখিত ধারণাগুলি উপলব্ধি করতে হবে :

অ্যারে পয়েন্টার নয়!

প্রথমত (এবং এটি যথেষ্ট প্রচার করা হয়েছে), অ্যারেগুলি পয়েন্টার নয় । পরিবর্তে, বেশিরভাগ ব্যবহারে, তারা তাদের প্রথম উপাদানটির ঠিকানার 'ক্ষয়' হয়ে থাকে, যা কোনও পয়েন্টারকে বরাদ্দ করা যেতে পারে:

int a[] = {1, 2, 3};

int *p = a; // p now points to a[0]

আমি ধরে নিলাম এটি এইভাবে কাজ করে যাতে অ্যারের সামগ্রীর সমস্তটি অনুলিপি না করেই অ্যাক্সেস করা যায়। এটি কেবল অ্যারের ধরণের আচরণ এবং বোঝানো হয় না যে তারা একই জিনিস।



বহুমাত্রিক অ্যারে

কম্পাইলার / মেশিনটি বুঝতে এবং পরিচালনা করতে পারে এমনভাবে পার্টিশন মেমরির একমাত্র উপায় মাত্র বহুমাত্রিক অ্যারে।

উদাহরণস্বরূপ, int a[4][3][5]= 4 * 3 * 5 (60) পূর্ণসংখ্যার আকারের মেমরির 'অংশগুলি' রয়েছে এমন একটি অ্যারে।

int a[4][3][5]বনাম প্লেইন ব্যবহার করার সুবিধাটি int b[60]হ'ল তারা এখন 'বিভাজন' হয়েছে (তাদের 'খণ্ডগুলি' দিয়ে কাজ করা সহজ, যদি প্রয়োজন হয়), এবং প্রোগ্রামটি এখন বাউন্ড চেকিং করতে পারে।

বস্তুত, int a[4][3][5]সংরক্ষণ করা হয় ঠিক মত int b[60]মেমরি - শুধুমাত্র পার্থক্য যে প্রোগ্রাম এখন এটি পরিচালনা করে যেন তারা নির্দিষ্ট আকারের পৃথক সত্বা হন (বিশেষভাবে, পাঁচটি তিনটি গ্রুপ চার গ্রুপ)।

মনে রাখবেন: উভয় int a[4][3][5]এবং int b[60]মেমরি একই আছে, এবং শুধু পার্থক্য কিভাবে তারা আবেদন / কম্পাইলার দ্বারা পরিচালিত করছি

{
  {1, 2, 3, 4, 5}
  {6, 7, 8, 9, 10}
  {11, 12, 13, 14, 15}
}
{
  {16, 17, 18, 19, 20}
  {21, 22, 23, 24, 25}
  {26, 27, 28, 29, 30}
}
{
  {31, 32, 33, 34, 35}
  {36, 37, 38, 39, 40}
  {41, 42, 43, 44, 45}
}
{
  {46, 47, 48, 49, 50}
  {51, 52, 53, 54, 55}
  {56, 57, 58, 59, 60}
}

এ থেকে আপনি পরিষ্কার দেখতে পাচ্ছেন যে প্রতিটি "পার্টিশন" কেবলমাত্র একটি অ্যারে যা প্রোগ্রামটি ট্র্যাক করে।



বাক্য গঠন

এখন অ্যারেগুলি বিন্দুগতভাবে পয়েন্টার থেকে পৃথক । বিশেষত, এর অর্থ এটি সংকলক / মেশিন তাদের সাথে অন্যরকম আচরণ করবে। এটি মস্তিষ্কের মত মনে হচ্ছে না তবে এটি একবার দেখুন:

int a[3][3];

printf("%p %p", a, a[0]);

উপরের উদাহরণটি একই মেমরি ঠিকানাটি দু'বার মুদ্রণ করে:

0x7eb5a3b4 0x7eb5a3b4

তবে কেবলমাত্র একজনকে সরাসরি সরাসরি পয়েন্টারে নির্ধারিত করা যেতে পারে :

int *p1 = a[0]; // RIGHT !

int *p2 = a; // WRONG !

কেন a একটি পয়েন্টার বরাদ্দ করা যাবে না তবে a[0] ?

এটি কেবলমাত্র বহুমাত্রিক অ্যারের ফলাফল এবং আমি ব্যাখ্যা করব কেন:

' a' এর স্তরে , আমরা এখনও দেখতে পাচ্ছি যে আমাদের অপেক্ষার জন্য আরও একটি 'মাত্রা' রয়েছে। ' a[0]' এর স্তরে যাইহোক, আমরা ইতিমধ্যে শীর্ষ মাত্রায় রয়েছি, সুতরাং যতক্ষণ না প্রোগ্রাম সম্পর্কিত, আমরা কেবল একটি সাধারণ অ্যারে খুঁজছি।

আপনি জিজ্ঞাসা করা হতে পারে:

অ্যারে যদি এটির জন্য একটি পয়েন্টার তৈরির ক্ষেত্রে বহুমাত্রিক হয় তবে এটি কেন গুরুত্বপূর্ণ?

এইভাবে চিন্তা করা ভাল:

বহুমাত্রিক অ্যারে থেকে 'ক্ষয়' কেবল একটি ঠিকানা নয়, পার্টিশন ডেটাযুক্ত একটি ঠিকানা (একে এটি এখনও বুঝতে পারে যে এর অন্তর্নিহিত ডেটা অন্যান্য অ্যারে দিয়ে তৈরি), এটি প্রথম মাত্রার বাইরে অ্যারের দ্বারা নির্ধারিত সীমানা নিয়ে গঠিত।

এই 'পার্টিশন' যুক্তিটি পয়েন্টারের মধ্যে উপস্থিত না থাকতে পারে যতক্ষণ না আমরা এটি উল্লেখ করি:

int a[4][5][95][8];

int (*p)[5][95][8];

p = a; // p = *a[0] // p = a+0

অন্যথায়, অ্যারের বাছাই করার বৈশিষ্ট্যগুলির অর্থ হারিয়ে যায়।

চারপাশে প্রথম বন্ধনী ব্যবহারের বিষয়টিও নোট করুন *p: int (*p)[5][95][8]- এটি নির্দিষ্ট করতে হবে যে আমরা এই সীমানাগুলি দিয়ে একটি পয়েন্টার তৈরি করছি, এই সীমাগুলির সাথে পয়েন্টারের একটি অ্যারে নয়:int *p[5][95][8]



উপসংহার

চলো পর্যালোচনা করি:

  • ব্যবহৃত প্রসঙ্গে যদি তাদের অন্য কোনও উদ্দেশ্য না থাকে তবে অ্যারে ঠিকানাগুলিতে ক্ষয় হয়
  • বহুমাত্রিক অ্যারে কেবল অ্যারেগুলির অ্যারে - সুতরাং, 'ক্ষয়প্রাপ্ত' ঠিকানাটি "আমার উপ-মাত্রা আছে" এর বোঝা বহন করবে
  • আপনি যদি এটি না দেন তবে মাত্রা ডেটা কোনও পয়েন্টারে উপস্থিত থাকতে পারে না

সংক্ষেপে: বহুমাত্রিক অ্যারেগুলিতে ক্ষয় হয় এমন ঠিকানাগুলিতে যা তাদের বিষয়বস্তু বোঝার ক্ষমতা রাখে।


1
উত্তরের প্রথম অংশটি দুর্দান্ত তবে দ্বিতীয়টি নয়। এটি সঠিক নয়: int *p1 = &(a[0]); // RIGHT !বাস্তবে এটি অনুরূপint *p1 = a;
2501

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

7

ভিতরে

int *ptr= l_matrix[0];

আপনি মত অ্যাক্সেস করতে পারেন

*p
*(p+1)
*(p+2)

সমস্ত 2 টি মাত্রিক অ্যারেগুলি 1-d হিসাবে সঞ্চিত হয়।


5

গ দিন,

ঘোষণা

static uint8_t l_matrix[10][20];

20 ইউনিট 8_t অবস্থানের 10 সারি, অর্থাৎ 200 টি uint8_t আকারের অবস্থানের জন্য পৃথক সঞ্চয়স্থান নির্ধারণ করেছে, প্রতিটি উপাদান 20 x সারি + কলাম গণনা করে পাওয়া যাবে।

তাই না

uint8_t (*matrix_ptr)[20] = l_matrix;

আপনার যা দরকার তা আপনাকে দিন এবং অ্যারের প্রথম সারির কলাম শূন্য উপাদানটি নির্দেশ করুন?

সম্পাদনা: এই সম্পর্কে আরও কিছুদুর ভাবনা, সংজ্ঞা অনুসারে একটি বিন্যাসের নাম নয়? অর্থাৎ, অ্যারের নামটি প্রথম উপাদানটির অবস্থানের প্রতিশব্দ, অর্থাৎ l_matrix [0] [0]?

সম্পাদনা 2: অন্যদের দ্বারা উল্লিখিত হিসাবে, আরও আলোচনার জন্য মন্তব্যের স্থানটি খুব সামান্য। যাই হোক:

typedef uint8_t array_of_20_uint8_t[20];
array_of_20_uint8_t *matrix_ptr = l_matrix;

প্রশ্নযুক্ত অ্যারেগুলির জন্য কোনও স্টোরেজ বরাদ্দ সরবরাহ করে না।

উপরে উল্লিখিত হিসাবে, এবং মান দ্বারা সংজ্ঞায়িত, বিবৃতি:

static uint8_t l_matrix[10][20];

uint8_t টাইপের 200 অনুক্রমিক অবস্থানগুলি আলাদা করে রেখেছেন।

ফর্মের বিবৃতি ব্যবহার করে l_matrix উল্লেখ:

(*l_matrix + (20 * rowno) + colno)

সারি রোনেও পাওয়া কলোনী উপাদানগুলির সামগ্রী আপনাকে দেবে।

সমস্ত পয়েন্টার ম্যানিপুলেশনগুলি স্বয়ংক্রিয়ভাবে নির্দেশিত বস্তুর আকার বিবেচনা করে। - কেএন্ডআর বিভাগ 5.4, পি। 103

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

আছে HTH

চিয়ার্স,


1
uint8_t (* matrix_ptr) [] [20] << প্রথম বন্ধনী বাদ করা আবশ্যক, সঠিক uint8_t (* matrix_ptr) [20]
আকনকাগুয়া

5

C99 এ (ঝনঝন এবং জিসিসি দ্বারা সমর্থিত) রেফারেন্স অনুসারে ফাংশনে বহু-মাত্রিক অ্যারেগুলি পাস করার জন্য একটি অস্পষ্ট বাক্য গঠন রয়েছে:

int l_matrix[10][20];

void test(int matrix_ptr[static 10][20]) {
}

int main(void) {
    test(l_matrix);
}

একটি সরল পয়েন্টার থেকে ভিন্ন, এটি অ্যারের আকার সম্পর্কে ইঙ্গিত দেয় , তাত্ত্বিকভাবে সংকলককে খুব ছোট অ্যারে পাস করার বিষয়ে সতর্ক করতে দেয় এবং সীমা অ্যাক্সেসের বাইরে স্পট স্পষ্ট করে দেয়।

দুঃখের বিষয়, এটি ঠিক করে না sizeof()এবং সংকলকরা এখনও সেই তথ্য ব্যবহার করে না বলে মনে হয়, তাই এটি একটি কৌতূহল থেকে যায়।


1
এই উত্তরটি বিভ্রান্তিকর: এটি যুক্তিটিকে একটি নির্দিষ্ট আকারের অ্যারে করে না, এটি এখনও একটি পয়েন্টার। static 10এমন একধরণের গ্যারান্টি যা কমপক্ষে 10 টি উপাদান উপস্থিত রয়েছে যার অর্থ আবার আকার স্থির হয়নি।
bluss

1
@ ব্লস প্রশ্নটি একটি পয়েন্টার সম্পর্কিত ছিল, সুতরাং আমি দেখছি না কীভাবে একটি পয়েন্টারের সাথে উত্তর দেওয়া ( রেফারেন্স দ্বারা উল্লেখ করা ) বিভ্রান্তিকর is অ্যারেটি ফাংশনের দৃষ্টিকোণ থেকে নির্দিষ্ট আকারের হয় কারণ এই সীমা ছাড়িয়ে উপাদানগুলির অ্যাক্সেস অপরিজ্ঞাত।
কর্নেল

আমি মনে করি না যে 10 এরও বেশি অ্যাক্সেস অপরিশোধিত, আমি এটি নির্দেশ করে এমন কিছু দেখতে পাচ্ছি না।
ব্লাস করুন

এই উত্তরটি মনে হয় যে কীওয়ার্ড ব্যতীত staticঅ্যারেটি রেফারেন্স দিয়ে পাস হবে না, যা সত্য নয়। অ্যারে যাইহোক রেফারেন্স দ্বারা পাস করা হয়। মূল প্রশ্নটি একটি ভিন্ন ব্যবহারের ক্ষেত্রে জিজ্ঞাসা করেছিল - একই ফাংশন / নেমস্পেসের মধ্যে পরিপূরক পয়েন্টার ব্যবহার করে 2 ডি অ্যারের উপাদানগুলিতে অ্যাক্সেস করা হয়।
Palo

4

আপনি সর্বদা রেকর্ডার হিসাবে অ্যারে ঘোষণা করে এবং নিজের দ্বারা সূচি গণনার জন্য (সারি, কর্ন) করে সংকলকটির সাথে ঘুরে বেড়ানো এড়াতে পারেন।

static uint8_t l_matrix[200];

void test(int row, int col, uint8_t val)

{

   uint8_t* matrix_ptr = l_matrix;
   matrix_ptr [col+y*row] = val; // to assign a value

}

এটি সংকলক যাইহোক কি করতে হবে।


1
সি সংকলক যাইহোক এটি করে। সি এর "অ্যারে" এর প্রকৃত ধারণা নেই - [] স্বরলিপিটি পয়েন্টার গাণিতিকের জন্য কেবল সিনট্যাকটিক চিনি
কেন কেইনান

7
এই সমাধানটি করার সঠিক উপায়টি কখনও খুঁজে না পাওয়ার অসুবিধা রয়েছে।
ক্রেগ ম্যাককুইন

2

বহুমাত্রিক অ্যারেতে নির্দেশ করে যে সূচকটি সূচনা করার প্রাথমিক বাক্য গঠন

type (*pointer)[1st dimension size][2nd dimension size][..] = &array_name

এটি কল করার জন্য মূল বাক্য গঠন

(*pointer_name)[1st index][2nd index][...]

এখানে একটি উদাহরণ:

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

int main() {
   // The multidimentional array...
   char balance[5][100] = {
       "Subham",
       "Messi"
   };

   char (*p)[5][100] = &balance; // Pointer initialization...

   printf("%s\n",(*p)[0]); // Calling...
   printf("%s\n",(*p)[1]); // Calling...

  return 0;
}

আউটপুট হল:

Subham
Messi

এটা কাজ করেছে...


1

আপনি এটি এর মতো করতে পারেন:

uint8_t (*matrix_ptr)[10][20] = &l_matrix;

1
এটি কি 10 * 20 বাইট মেষ দখল করে না? (একটি মাইক্রোকন্ট্রোলারের উপর im)
ডিসি

এটি আপনার বাক্সে 4 বাইট বা কোনও পয়েন্টার বড় আকার ধারণ করবে occup তবে মনে রাখবেন আপনার যদি এটি থাকে তবে আপনাকে ম্যাট্রিক্স_পিটার [0] [x] [y] বা (* ম্যাট্রিক্স_পিটার) [এক্স] [ওয়াই] এর সাথে সূচী করতে হবে। এটি "দ্বি-মাত্রিক অ্যারেটির পয়েন্টার" এর সরাসরি এবং শব্দ-শব্দের ব্যাখ্যা: পি
জোহানেস স্কাউব - লিটব

ধন্যবাদ লিটব, আমি কীভাবে এটি অ্যাক্সেস করব তা উল্লেখ করতে ভুলে গেছি। আপনি নিজের উত্তর দিয়ে দুর্দান্ত কাজ করেছেন বলে আমার উত্তরটি সম্পাদন করার কোনও মানে নেই :)
নিক ডানডৌলাকিস

সুতরাং, এটি কি র‌্যামের 10 * 20 বাইট দখল করে?
ডানিজেল 10

@ ডানিজেল, যেহেতু এটি দ্বি-মাত্রিক অ্যারেটির নির্দেশক, এটি আপনার বাক্সে কেবলমাত্র 4 বাইট বা পয়েন্টার আকারের আকার ধারণ করবে, যেমন 16-বিট, 32-বিট, 64-বিট, ইত্যাদি
নিক ডানডোলাকিস

1

আপনি প্রথম উপাদানটির একটি পয়েন্টার চান, তাই;

static uint8_t l_matrix[10][20];

void test(){
   uint8_t *matrix_ptr = l_matrix[0]; //wrong idea 
}

0

আপনি নেতিবাচক সূচকগুলি ব্যবহার করতে চাইলে আপনি একটি অফসেট যুক্ত করতে পারেন:

uint8_t l_matrix[10][20];
uint8_t (*matrix_ptr)[20] = l_matrix+5;
matrix_ptr[-4][1]=7;

যদি আপনার সংকলক কোনও ত্রুটি বা সতর্কতা দেয় তবে আপনি ব্যবহার করতে পারেন:

uint8_t (*matrix_ptr)[20] = (uint8_t (*)[20]) l_matrix;

হ্যালো. এই প্রশ্নটির সাথে ট্যাগ করা হয়েছে c, সুতরাং উত্তরটি একই ভাষায় হওয়া উচিত। ট্যাগগুলি পর্যবেক্ষণ করুন।
2501
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.