📜  C数组与指针之间的关系(1)

📅  最后修改于: 2023-12-03 15:00:12.353000             🧑  作者: Mango

C数组与指针之间的关系

在 C 语言中,数组与指针之间有着紧密的联系。在理解数组和指针的关系之前,我们需要先清楚数组的基本概念。

数组

数组是一组相同类型的数据元素的集合。元素的类型可以是任何有效的 C 数据类型,如 intcharfloat 等。数组中的元素通过一个索引值访问,第一个元素的索引为 0,第二个元素的索引为 1,以此类推。数组的声明方式如下:

type arrayName[arraySize];

其中,type 是数组的元素类型,arrayName 是数组的名称,arraySize 是数组的长度。例如,下面的语句声明了一个包含 10 个整数的数组:

int myArray[10];

在数组中,元素是按照一定的顺序依次存储的,每个元素在内存中占用的空间大小由其数据类型决定。例如,对于 int 类型的元素,占用 4 个字节的空间;对于 char 类型的元素,占用 1 个字节的空间。

我们可以通过数组名和索引值来访问数组中的元素。例如,myArray[0] 表示数组中的第一个元素,myArray[1] 表示数组中的第二个元素,以此类推。

指针

在 C 语言中,指针是一种数据类型,用于存储变量的内存地址。指针变量本身也有自己的内存地址,它所占用的空间大小与系统架构有关。

指针变量的声明方式如下:

type *pointerName;

其中,type 是指针所指向的数据类型,pointerName 是指针的名称。例如,下面的语句声明了一个指向整数的指针:

int *myPointer;

指针变量存储的是一个内存地址,它可以通过取地址运算符 & 来获取某个变量的地址,例如:

int myVariable = 10;
int *myPointer = &myVariable;

以上语句中,&myVariable 表示获取变量 myVariable 的地址,然后将该地址赋值给指针 myPointer

指针变量可以通过解引用运算符 * 来访问其所指向的变量,例如:

int myVariable = 10;
int *myPointer = &myVariable;
*myPointer = 20;

以上语句中,*myPointer 表示访问指针 myPointer 所指向的变量,即变量 myVariable。将其赋值为 20,因此变量 myVariable 的值也被更新为 20。

数组与指针的关系

在 C 语言中,数组名可以看作是一个指向该数组第一个元素的指针。例如,对于下面的数组声明:

int myArray[10];

可以将其看作是一个整型指针,它存储的是第一个元素的地址:

int *myPointer = &myArray[0];

由于指针与数组名是等价的,因此可以使用指针来访问数组中的元素,例如:

int myArray[10];
int *myPointer = &myArray[0];
myPointer[0] = 1;
myPointer[1] = 2;

以上语句中,myPointer[0]myPointer[1] 分别访问数组中的第一个和第二个元素,并将它们的值分别设置为 1 和 2。

除了使用指针来访问数组中的元素之外,还可以通过将指针加上一个偏移量来实现指向其他元素的指针。例如,myPointer + 1 表示将指针 myPointer 加上一个偏移量 1,即指向数组中的第二个元素。同样地,myPointer + 2 表示指向数组中的第三个元素,以此类推。

与指针变量类似,数组名也存储了一份内存地址。然而,与指针变量不同的是,数组名的值不能被修改。即使将指针指向了数组名,也不能修改数组名的值。这是因为数组名实际上是一个常量,它存储的内存地址是由系统在编译时自动生成的。因此,下面的语句是非法的:

int myArray[10];
int *myPointer = myArray;
myArray = myPointer; // 非法

以上语句中,赋值语句 myArray = myPointer 将指针 myPointer 赋值给数组名 myArray,这是非法的,会导致编译错误。

总结

在 C 语言中,数组和指针之间有着紧密的联系。数组名可以看作是一个指向数组第一个元素的指针,因此可以使用指针来访问数组中的元素。另外,指针可以通过加上一个偏移量来实现指向其他元素的指针。需要注意的是,数组名是一个常量,不能被修改,不同于指针变量。