> For the complete documentation index, see [llms.txt](https://mominur.gitbook.io/mominur-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mominur.gitbook.io/mominur-notes/random-topics/why-zero-based-indexing.md).

# Why Zero Based Indexing

### **কেন Array Index 0 থেকে শুরু হয়?**

প্রোগ্রামিং শেখার সময় প্রথম ধাক্কাগুলোর একটি হলো—কেন Array বা List-এর Index 0 থেকে শুরু হয়? আমরা দৈনন্দিন জীবনে গণনা শুরু করি 1 থেকে, কিন্তু কম্পিউটার কেন 0 থেকে শুরু করে? আসুন, ব্যাখ্যা করা যাক!

### **1) Memory Address and 0-Based Indexing**

প্রতিটি Array এর একটি **Base Address** থাকে, যা প্রথম  Element এর Memory Location নির্দেশ করে। ধরা যাক, একটি **Integer Array** আছে, যেখানে প্রতিটি সংখ্যা 4 byte মেমোরি ব্যবহার করছে

| Index | Value | Memory Address |
| ----- | ----- | -------------- |
| 0     | 10    | 1000           |
| 1     | 20    | 1004           |
| 2     | 30    | 1008           |

**Formula:**\ <mark style="color:green;">**Address =**</mark>**&#x20;**<mark style="color:orange;">**Base Address**</mark>**&#x20;**<mark style="color:green;">**+ (**</mark><mark style="color:purple;">**Index**</mark>**&#x20;**<mark style="color:green;">**X**</mark>**&#x20;**<mark style="color:red;">**Size of element**</mark><mark style="color:green;">**)**</mark>

যদি Index 1 থেকে শুরু হতো, তাহলে গণনায় (Index - 1) করতে হতো, যা বাড়তি গাণিতিক ঝামেলা তৈরি করতো। তাই 0-Based Indexing গণনাকে সহজ ও কার্যকরী করে

### **2) Pointer ও Address Calculation সহজ করে**

C-এর মতো ভাষায় Pointer Arithmetic সহজ করতে 0-Based Indexing ব্যবহৃত হয়। ধরা যাক, `arr` একটি Array, তাহলে **arr\[0]** হচ্ছে **Base Address**।

```c
int arr[] = {10, 20, 30};
printf("%d", *(arr + 0)); // Output: 10
```

যদি Index 1-Based হতো, তাহলে `arr[1]` আসলে প্রথম এলিমেন্ট নয়, যা ভুল বোঝাবুঝির কারণ হতো।

### **3) String-এ 0-Based Indexing**

String মূলত Character Array। `Hello` String-এর জন্য মেমোরি ম্যাপিং এমন হবে:

| Index | Character |
| ----- | --------- |
| 0     | H         |
| 1     | e         |
| 2     | l         |
| 3     | l         |
| 4     | o         |

**text\[0] = H**, যা সরাসরি Base Address থেকে পাওয়া যায়। তাই 0-Based Indexing সহজতর করে String Manipulation!

### **4) যদি 1-Based Indexing হতো?**

1-Based Indexing থাকলে প্রতিটি এলিমেন্ট অ্যাক্সেস করতে **(Index - 1)** করতে হতো:

```c
// 1-Based Indexing হলে:
Address = Base Address + ((Index - 1) * Size of element)
```

এতে অতিরিক্ত গাণিতিক কাজ লাগত এবং অপারেশন ধীরগতির হতো। তাই কার্যকারিতা বজায় রাখতে 0-Based Indexing আদর্শ।

### **5) কোন ভাষা 1-Based Indexing ব্যবহার করে?**

যদিও বেশিরভাগ ভাষা **0-Based Indexing** ব্যবহার করে, কিছু ভাষা **1-Based Indexing** অনুসরণ করে:

* Lua – গেম স্ক্রিপ্টিংয়ে ব্যবহৃত।
* MATLAB – গণিত ও সিমুলেশনে ব্যবহৃত।
* R – Data Science-এর জন্য।
* Fortran – সায়েন্টিফিক কম্পিউটিংয়ে ব্যবহৃত।

তবে, অধিকাংশ High-Performance Language (C, C++, Java, Python, PHP, JavaScript) 0-Based Indexing অনুসরণ করে।

### **Summary**

✅ 0-Based Indexing মেমোরি অ্যাড্রেসিং ও Pointer-এর সাথে সুন্দরভাবে কাজ করে।\
✅ অতিরিক্ত গাণিতিক অপারেশন কমিয়ে প্রোগ্রামিং সহজ করে।\
✅ String ও Floating-Point Array-তেও এটি কার্যকরী।\
✅ এটি প্রোগ্রামিং ভাষার জন্য একটি স্ট্যান্ডার্ড প্যাটার্ন তৈরি করেছে।

তাই, 0-Based Indexing শুধু কনভেনশন নয়, এটি কার্যকারিতার জন্য অত্যন্ত গুরুত্বপূর্&#x9A3;**!**&#x20;

{% hint style="info" %}
**References**

1. Stack Exchange. (2011). *Why are zero-based arrays the norm?* Software Engineering Stack Exchange. <https://softwareengineering.stackexchange.com/questions/110804/why-are-zero-based-arrays-the-norm>
2. Arvato Tech. (2022, September 8). *Starting from zero: The logic behind zero-based indexing*. Medium. <https://medium.com/arvatotech/starting-from-zero-the-logic-behind-zero-based-indexing-30703702d874>
3. Codefinity. (n.d.). *Why do programmers count from zero?* <https://codefinity.com/blog/Why-Do-Programmers-Count-from-Zero>
4. Dijkstra, E. W. (1982). *Why numbering should start at zero (EWD831)*. Department of Computer Sciences, University of Texas at Austin. <https://www.cs.utexas.edu/~EWD/transcriptions/EWD08xx/EWD831.html>
   {% endhint %}
