Cprogramming 简明教程
Pointer vs Array in C
但是,数组和指针之间存在某些概念差异。阅读本章以了解它们的差异以及各自的优缺点。
Arrays in C
在 C 程序中,数组是由相同类型元素组成的索引集合,这些元素存储在相邻的内存位置中。
要 declare an array, 我们使用以下 syntax :
data_type arr_name [size];
size 应为非负整数。例如:
int arr[5];
array can be initialized along with the declaration, with the elements given as a comma-separated list inside the curly brackets. Mentioning its size is optional.
int arr[] = {1, 2, 3, 4, 5};
数组中的每个元素都以一个从“0”开始的唯一 integral index, 为特征。在 C 语言中,数组的 lower bound 总为“0”,而 upper bound 为“size – 1”。
Example of an Array
以下示例展示了如何遍历带有索引下标的数组 -
#include <stdio.h>
int main (){
/* an array with 5 elements */
int arr[5] = {10, 20, 30, 40, 50};
int i;
/* output each array element's value */
printf("Array values with subscripts: \n");
for(i = 0; i < 5; i++){
printf("arr[%d]: %d\n", i, arr[i]);
}
return 0;
}
当你运行这段代码时,它将产生以下输出:
Array values with subscripts:
arr[0]: 10
arr[1]: 20
arr[2]: 30
arr[3]: 40
arr[4]: 50
Pointers in C
C 允许你访问一个变量的存储器位置,这个变量已由编译器随机分配。 address−of operator (&) 返回变量的地址。
variable 存储一个变量的地址称为指针。指针的类型必须与它存储地址的类型相同。
为了与目标变量类型区分开来,指针名称前缀为星号 ( ). If we have an *int 变量,其指针声明为 "int *". 。
int x = 5;
int *y = &a;
Note: 对于数组,其第 0 个元素的地址分配给指针。
int arr[] = {1, 2, 3, 4, 5};
int *ptr = &arr[0];
事实上,数组本身的名称解析为第 0 个元素的地址。
因此,我们同样可以编写 -
int *ptr = arr;
由于数组元素放置在相邻的存储器位置中,每个下标的地址递增 4(对于 int 数组),我们可以使用此功能借助指针来遍历数组元素。
Example of a Pointer
以下示例展示了如何遍历带有指针的数组 -
#include <stdio.h>
int main (){
/* an array with 5 elements */
int arr[5] = {10, 20, 30, 40, 50};
int *x = arr;
int i;
/* output each array element's value */
printf("Array values with pointer: \n");
for(i = 0; i < 5; i++) {
printf("arr[%d]: %d\n", i, *(x+i));
}
return 0;
}
运行代码并检查其输出:
Array values with pointer
arr[0]: 10
arr[1]: 20
arr[2]: 30
arr[3]: 40
arr[4]: 50
Difference between Arrays and Pointers in C
下表突显了数组和指针之间的重要区别 -
Array |
Pointer |
它存储同类数据类型的所有元素中的相邻存储器位置。 |
它存储一个变量或一个数组的地址 |
一个数组被定义为类似数据类型的集合。 |
一个指针是一个存储另一个变量的地址的变量。 |
可以存储的变量数由数组的大小决定。 |
一个指针只能存储一个变量的地址。 |
可以在定义数组时对其初始化。 |
无法在定义指针时对其进行初始化。 |
数组的本质是静态的。 |
指针的本质是动态的。 |
根据用户需要,不能调整数组的大小。 |
随时都可以调整指针的大小。 |
在编译时完成数组分配。 |
在运行时完成指针分配。 |