Skip to content

Commit

Permalink
Update 2.1-pointer.md
Browse files Browse the repository at this point in the history
تصحیح متن
  • Loading branch information
r3a70 committed Jun 4, 2023
1 parent 33af927 commit c6360b2
Showing 1 changed file with 19 additions and 13 deletions.
32 changes: 19 additions & 13 deletions content/chapter 2/2.1-pointer.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,23 @@ slug: pointer
weight: 3001
---

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

```go
var ex *T
```

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

در {{< tooltip text="اشاره گر" note="pointer" >}} ۲ تا اپراتور داریم که هر کدام از این ها را در کنار یک متغیر بزاریم به آدرس حافظه یا مقدار داخل خانه حافظه متغیر قبلی دسترسی پیدا می کنیم :

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

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

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

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

Expand All @@ -24,18 +29,18 @@ var ex *T

## 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 اشاره گر تعریف کردیم و سپس داخل آدرس حافظه 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 استفاده از اپراتور '&'
Expand All @@ -48,7 +53,7 @@ b := &a
fmt.Println(*b) //Output will be 2
```

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

```go
package main
Expand All @@ -75,14 +80,15 @@ $ go run main.go
10
```

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

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

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

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

```go
package main
Expand Down Expand Up @@ -115,7 +121,7 @@ $ go run main.go
4
```

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

## 2.1.4 اشاره گر به یک اشاره گر

Expand Down

0 comments on commit c6360b2

Please sign in to comment.