📅  最后修改于: 2023-12-03 15:00:12.353000             🧑  作者: Mango
在 C 语言中,数组与指针之间有着紧密的联系。在理解数组和指针的关系之前,我们需要先清楚数组的基本概念。
数组是一组相同类型的数据元素的集合。元素的类型可以是任何有效的 C 数据类型,如 int
、char
、float
等。数组中的元素通过一个索引值访问,第一个元素的索引为 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 语言中,数组和指针之间有着紧密的联系。数组名可以看作是一个指向数组第一个元素的指针,因此可以使用指针来访问数组中的元素。另外,指针可以通过加上一个偏移量来实现指向其他元素的指针。需要注意的是,数组名是一个常量,不能被修改,不同于指针变量。