Skip to content

Commit

Permalink
Merge pull request #289 from ezzoddin/main
Browse files Browse the repository at this point in the history
Update typography and spacing corrections in all Chapter 2
  • Loading branch information
Ja7ad authored Aug 20, 2023
2 parents 9ca6552 + 5157382 commit 160b272
Show file tree
Hide file tree
Showing 8 changed files with 205 additions and 202 deletions.
44 changes: 22 additions & 22 deletions content/chapter 2/2.1-pointer.md
Original file line number Diff line number Diff line change
@@ -1,59 +1,59 @@
---
title: '2.1 اشاره گر (Pointer)'
title: '2.1 اشارهگر (Pointer)'
slug: pointer
weight: 3001
---

{{< tooltip text="اشاره گر" note="pointer" >}} در واقع متغیری است که آدرس حافظه یک مقدار را نگه می دارد.
{{< tooltip text="اشارهگر" note="pointer" >}} در واقع متغیری است که، آدرس حافظه یک مقدار را نگه میدارد.

```go
var ex *T
```

در مثال بالا ما شیوه ی تعریف یک متغیر اشاره گر را توضیح دادیم. اول کلید واژه ی **var** بعد اسم متغیر و در آخر هم *T یعنی تایپ متغیر. به مثال زیر توجه کنین:
در مثال بالا ما شیوه تعریف یک متغیر اشارهگر را توضیح دادیم. اول کلید واژه ی **var** بعد اسم متغیر و در آخر هم *T یعنی تایپ متغیر. به مثال زیر توجه کنید:


```go
var ptr *string
```

در تعریف {{< tooltip text="اشاره گر" note="pointer" >}} ها, ما ۲ تا اپراتور داریم که کارکرد هر کدوم از این اپراتورها رو در ادامه براتون توضیح میدم:
در تعریف {{< tooltip text="اشارهگر" note="pointer" >}}ها, ما ۲ تا اپراتور داریم که کارکرد هر کدام از این اپراتورها رو در ادامه توضیح میدم:

- `&` `بهش میگن ampersand` با استفاده از این می توانیم آدرس حافظه متغیر فرضا x را به متغیر دیگری بدهیم (`y := &x`)
- `*` `بهش میگن asterisk` با استفاده از این می توانیم به مقدار داخل حافظه متغیر فرضا x دسترسی پیدا کنیم (`x*`)
- `&` `بهش میگن ampersand` با استفاده از این میتوانیم آدرس حافظه متغیر فرضا x را به متغیر دیگری بدهیم (`y := &x`)
- `*` `بهش میگن asterisk` با استفاده از این میتوانیم به مقدار داخل حافظه متغیر فرضا x دسترسی پیدا کنیم (`x*`)

برای اینکه یک {{< tooltip text="اشاره گر" note="pointer" >}} تعریف کنیم ۲ روش وجود دارد :
برای اینکه یک {{< tooltip text="اشاره گر" note="pointer" >}} تعریف کنیم ۲ روش وجود دارد:

1. استفاده از تابع `new`
2. استفاده از اپراتور `&` (آمپرسند)

## 2.1.1 استفاده از تابع new

یک {{< tooltip text="اشاره گر" note="pointer" >}} با استفاده از تابع `new` بصورت مثال زیر تعریف می شود :
یک {{< tooltip text="اشارهگر" note="pointer" >}} با استفاده از تابع `new` بصورت مثال زیر تعریف شده است:

```go
a := new(int)
*a = 10
fmt.Println(*a) //Output will be 10
```

در مثال بالا ما متغیر a را از نوع int اشاره گر `pointer a` تعریف کردیم, و سپس داخل آدرس حافظه a مقدار ۱۰ را قرار دادیم.
در مثال بالا ما متغیر a را از نوع int اشارهگر `pointer a` تعریف کردیم و سپس داخل آدرس حافظه a مقدار ۱۰ را قرار دادیم.

{{< hint warning >}}
توجه کنید مقدار پیش فرض یک متغیر از نوع {{< tooltip text="اشاره گر" note="pointer" >}} `nil` می باشد. اگر جایی شما متغیر از نوع {{< tooltip text="اشاره گر" note="pointer" >}} را بصورت `nil` بفرستید ممکن است به panic از نوع **nil pointer** بر بخورید و اجرای برنامه شما کاملا متوقف شود.
توجه کنید مقدار پیشفرض یک متغیر از نوع {{< tooltip text="اشارهگر" note="pointer" >}} `nil` است. اگر جایی شما متغیر از نوع {{< tooltip text="اشارهگر" note="pointer" >}} را بصورت `nil` بفرستید ممکن است به panic از نوع **nil pointer** بر بخورید و اجرای برنامه شما کاملا متوقف شود.
{{< /hint >}}

## 2.1.2 استفاده از اپراتور '&'

برای دریافت آدرس حافظه یک متغیر از `&` استفاده می شود :
برای دریافت آدرس حافظه یک متغیر از `&` می‌توان استفاده کرد:

```go
a := 2
b := &a
fmt.Println(*b) //Output will be 2
```

به مثال زیر توجه کنید :
به مثال زیر توجه کنید:

```go
package main
Expand All @@ -80,13 +80,13 @@ $ go run main.go
10
```

در خروجی بالا `0xc0000b0018` آدرس حافظه متغیر a می باشد. در واقع متغیر a ساخته شد و ما آدرس حافطه ی اون رو به متغیر b دادیم. یعنی هر دو متغیر به یک آدرس از حافظه اشاره میکنن.
در خروجی بالا `0xc0000b0018` آدرس حافظه متغیر a است. در واقع متغیر a ساخته شد و ما آدرس حفظه آن را به متغیر b دادیم. یعنی هر دو متغیر به یک آدرس از حافظه اشاره می‌کنند.

## 2.1.3 اپراتور * اشاره گر
## 2.1.3 اپراتور * اشارهگر

ما می توانیم اپراتور * را برای عملیات های زیر به کار ببریم :
ما میتوانیم اپراتور * را برای عملیاتهای زیر به کار ببریم:

- گرفتن مقدار یک آدرس حافظه که با استفاده از اشاره گر ذخیره شده است.
- گرفتن مقدار یک آدرس حافظه که با استفاده از اشارهگر ذخیره شده است.
- تغییر مقدار یک آدرس حافظه.
### به مثال زیر توجه کنید:

Expand Down Expand Up @@ -121,11 +121,11 @@ $ go run main.go
4
```

در مثال بالا `a` و `b*` هر دو دارند به یک آدرس از حافظه اشاره می کنند. بنابرین تغییر مقدار یکی از آن ها, روی هر دو متغیر تاثیر میگذارد.
در مثال بالا `a` و `b*` هر دو دارند به یک آدرس از حافظه اشاره میکنند. بنابرین تغییر مقدار یکی از آن‌ها، روی هر دو متغیر تاثیر می‌گذارد.

## 2.1.4 اشاره گر به یک اشاره گر (Double Pointers)
## 2.1.4 اشارهگر به یک اشارهگر (Double Pointers)

شما می توانید یک متغیر اشاره گر تعریف کنید و متغیر اشاره گر دیگری را بهش اختصاص دهید.
شما می‌‌توانید یک متغیر اشارهگر تعریف کنید و متغیر اشارهگر دیگری را بهش اختصاص دهید.

```go
a := 2
Expand All @@ -135,9 +135,9 @@ c := &b

![array](../../assets/img/content/chapter2/pointer/1.jpg)

همونطور که در مثال و عکس بالا میبینید, متغیر a مقدارش ۲ و آدرسش در حافظه `0xXXXXXX` است. در مقدار متغیر b ما اشاره کردیم به آدرس حافظه متغیر a و در ادامه در متغیر c به آدرس حافظه متغیر b اشاره کردیم.
همانطور که در مثال و عکس بالا می‌بینید، متغیر a مقدارش ۲ و آدرسش در حافظه `0xXXXXXX` است. در مقدار متغیر b ما اشاره کردیم به آدرس حافظه متغیر a و در ادامه در متغیر c به آدرس حافظه متغیر b اشاره کردیم.

زمانیکه شما بخواهید مقدار c را چاپ کنید کافیه از `c**` استفاده کنید تا مقدار ۲ را چاپ کند.
زمانیکه شما بخواهید مقدار c را چاپ کنید کافیست از `c**` استفاده کنید تا مقدار ۲ را چاپ کند.

به مثال زیر توجه کنید:

Expand Down Expand Up @@ -201,7 +201,7 @@ c: 824633778216
```

{{< hint danger >}}
توجه کنید در زبان گو علی رغم زبان c استفاده از اشاره گر حسابی (Pointer Arithmetic) امکان پذیر نمی باشد و در صورت استفاده با خطای زیر مواجه خواهید شد :
توجه کنید در زبان گو علی رغم زبان c استفاده از اشارهگر حسابی (Pointer Arithmetic) امکان پذیر نمیباشد و در صورت استفاده با خطای زیر مواجه خواهید شد:
```go
package main
func main() {
Expand Down
Loading

0 comments on commit 160b272

Please sign in to comment.