Skip to content

Commit

Permalink
docs: note pointer update 8
Browse files Browse the repository at this point in the history
  • Loading branch information
SkyR0ver committed Dec 11, 2023
1 parent 76f5bd5 commit 0902829
Showing 1 changed file with 4 additions and 2 deletions.
6 changes: 4 additions & 2 deletions docs/programming/topic/pointers.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ type-specifier * qualifiers declarator
<!-- prettier-ignore-start -->
??? info "C 语言中只有值传递"

如果你学习过 C++,你可能会想到将形参的类型声明为引用,随后通过引用改变实参的值。然而,C 语言中没有引用类型,在形参类型中添加 `&` 是语法错误
如果你学习过 C++,你可能会想到将形参的类型声明为引用,随后通过引用改变实参的值。然而,C 语言中没有引用类型,在形参类型中添加 `&` 是非法的
<!-- prettier-ignore-end -->

不过,如果我们期望函数产生副作用,值传递的方式便无法满足需求。为解决这一问题,我们可以引入指针类型的参数,以达到修改其他对象的目的。
Expand Down Expand Up @@ -268,7 +268,9 @@ C 标准规定,表达式 `E1[E2]` 等价于 `(*((E1) + (E2)))`。这意味着
C 语言不会检查数组下标是否超过数组长度,对指针也几乎没有限制措施。尝试访问超出数组边界的内存地址,可能导致与尝试解引用野指针等同的危害。**数组访问越界是段错误的主要诱因之一。**因此,访问数组元素前,务必充分检查指定的下标与指针偏移量是否在数组范围内。
<!-- prettier-ignore-end -->

根据标准规定,作为参数传递时,数组应被隐式转换为其首元素指针,这是因为复制数组的开销经常大到不可接受。所以,在语法层面上,函数定义中(即参数类型与返回值类型处)`char []` 类型声明与 `char *` 类型声明是等价的,不过前者可以提醒函数编写者与使用者留意 `s` 的实际含义。当然,你也可以传入指向其他元素的指针,这对函数而言没有语义区别。
由于复制数组的开销经常大到不可接受,C 标准规定,作为参数传递时数组也应被隐式转换为其首元素指针。所以,在语法层面上,函数声明与定义中,形如 `char str[]` 的形参声明与 `char *str` 是等价的,不过前者可以提醒函数编写者与使用者留意 `str` 的实际含义。当然,你也可以传入指向其他元素的指针,这在传参过程中没有区别。

需要注意的是,返回类型中的数组不会自动转换成指针,因此形如 `char func() [];` 的函数声明是非法的。

<!-- prettier-ignore-start -->
!!! note "数组类型与指针类型的区别"
Expand Down

0 comments on commit 0902829

Please sign in to comment.