指针与数组

💡 原文英文,约4600词,阅读约需17分钟。
📝

内容提要

本文介绍了指针的概念、用法、声明和使用方法,以及指针与数组的关系。还讨论了变量类型、内存大小的关系,以及使用sizeof运算符确定类型大小。最后,介绍了字符串的存储和使用方法。

🔎

延伸解读

指针与数组的本质区别

文章强调数组名不是指针,而是代表整个数组对象。但在大多数表达式中,数组名会隐式转换为指向首元素的指针,这称为“数组类型退化”。例外是当数组名作为sizeof或&的操作数时,它代表整个数组。理解这一点有助于避免混淆,例如不能对数组名赋值,但可以将其赋给指针变量。

指针运算的实际含义

指针算术不是简单的整数加法,而是基于所指类型的大小。例如,int指针加1,地址增加4字节(假设int为4字节)。文章通过示例展示了a+1与&a[1]等价,并解释了计算机如何根据类型大小计算下一个元素的位置。这适用于数组和普通指针,是高效访问数组元素的基础。

函数参数传递与指针修改

C语言函数参数按值传递,即复制实参的值。因此,直接传递变量无法在函数内修改原变量。但传递指针时,复制的是地址,函数可以通过解引用指针修改原变量。文章通过对比示例说明了这一点,并提醒指针本身也是按值传递的,但因其值为地址,故能间接修改外部变量。

字符串的存储与终止符

C字符串以字符数组形式存储,并以空字符'\0'结尾。使用双引号字符串时,编译器会自动添加'\0',因此数组长度需比字符数多1。字符串的值是其首字符的地址,这使得C函数可以通过指针遍历字符直到遇到'\0'。文章示例展示了字符数组和字符串字面量的内存布局及地址。

❓

Q&A

指针是什么?

指针是一个包含内存地址的变量。

如何声明一个指针?

指针的声明格式为 var_type *var,例如 int *ptr;

sizeof运算符的作用是什么?

sizeof运算符用于确定变量类型的大小,以字节为单位。

数组和指针有什么区别?

数组不是指针,数组名在大多数上下文中会隐式转换为指向第一个元素的指针,但它本身不是指针。

如何通过指针修改变量的值?

可以使用解引用操作符*来访问和修改指针指向的值,例如 *p = 402; 将修改指针p所指向的变量的值。

字符串在C语言中是如何存储的?

字符串可以通过字符数组或双引号文本来创建,并以' '结尾。

🏷️

标签

➡️

继续阅读