赞
踩
数组在内存中是连续存放的,其名称代表了数组首元素的首地址,该地址是常量, 也就是一个指向数组首元素的指针。因此,指针和数组有着密切的关系:
可以使用指针来访问和操作数组中的元素。通过指针的算术运算,可以移动指针的指向,使其指向数组中的其他元素。这种指针的运算在数组操作中非常常见,可以灵活地遍历和处理数组元素。
数组的下标运算符[]实际上是以指针作为其操作数的。这意味着数组元素可以通过指针来引用,而指针也可以用下标形式来表示。这种等价性可以用指针来实现原本用数组实现的操作,从而提供了更多的灵活性和可能性。
当数组作为函数形参时,它会退化为指向数组首元素的指针。
指针访问数组元素是一种常见且高效的操作方式。数组在内存中是连续存储的,而数组名在大多数上下文中会退化为指向数组首元素的指针。因此,可以通过这个指针加上偏移量来访问数组中的任意元素。
指针访问数组元素的定义通常涉及以下步骤:
定义数组:需要定义一个数组并初始化它。
int array[] = {1, 2, 3, 4, 5};
获取数组首元素的地址:数组名 array
在这个上下文中会退化为指向数组首元素(即 array[0]
)的指针
- // ptr 现在指向 array[0]
- int *ptr = array;
使用指针访问数组元素:通过给指针加上适当的偏移量,可以访问数组中的其他元素。偏移量通常是元素大小的整数倍。
int element = *(ptr + index); // 访问数组中的第 index+1 个元素
遍历数组:可以通过递增指针来遍历整个数组。
- for (int i = 0; i < sizeof(array) / sizeof(array[0]); i++)
- {
- printf("%d ", *(ptr + i)); // 打印数组中的每个元素
- }
扩展,
指针访问数组元素的方法包括:
指针名加数组元素下标,语法格式:
- // 数组定义
- 数据类型 数组名 = {初始值};
-
- // 定义指针并指向数组首地址
- 数据类型 *指针变量 = 数组名;
-
- // 指针加数组下标,访问具体数组元素
- 指针变量[数组下标];
代码示例:
- #include <stdio.h>
-
- int main()
- {
- // 定义数组
- int array[] = {1, 2, 3, 4, 5};
- // 定义指针并指向数组首地址
- int *ptr = array;
-
- // 通过数组下标访问元素,注意,不要下标不要超过了(数组长度 - 1)
- // 访问数组中第2个元素,相当于array[1]
- printf("%d\n", ptr[1]);
- // 访问数组中第4个元素,相当于array[3]
- printf("%d\n", ptr[3]);
-
- return 0;
- }
指针变量运算,语法格式:
- // 数组定义
- 数据类型 数组名 = {初始值};
-
- // 定义指针并指向数组首地址
- 数据类型 *指针变量 = 数组名;
-
- // 指针加数组下标
- *(指针变量 + 数组下标);
代码示例:
- #include <stdio.h>
-
- int main()
- {
- // 定义数组
- int array[] = {1, 2, 3, 4, 5};
- // 定义指针并指向数组首地址
- int *ptr = array;
-
- // 通过数组下标访问元素,注意,不要下标不要超过了(数组长度 - 1)
- // 访问数组中第2个元素,相当于array[1]
- printf("%d\n", *(ptr + 1));
- // 访问数组中第4个元素,相当于array[3]
- printf("%d\n", *(ptr + 3));
-
- return 0;
- }
既然指针可以访问数组元素,那么,可以通过指针对数组元素进行修改,包括:
指针名加数组元素下标,语法格式:
- // 数组定义
- 数据类型 数组名 = {初始值};
-
- // 定义指针并指向数组首地址
- 数据类型 *指针变量 = 数组名;
-
- // 指针加数组下标,修改具体数组元素
- 指针变量[数组下标] = 常量或者变量;
代码示例:
- #include <stdio.h>
-
- int main()
- {
- // 定义数组
- int array[] = {1, 2, 3, 4, 5};
- // 定义指针并指向数组首地址
- int *ptr = array;
-
- // 通过数组下标访问元素,注意,不要下标不要超过了(数组长度 - 1)
- // 访问数组中第2个元素,相当于array[1]
- printf("数组第2个元素修改前的值是%d\n", ptr[1]);
-
- // 修改数组中第2个元素
- ptr[1] = 10;
- printf("数组第2个元素修改后的值是%d\n", ptr[1]);
-
-
- return 0;
- }
指针变量运算,语法格式:
- // 数组定义
- 数据类型 数组名 = {初始值};
-
- // 定义指针并指向数组首地址
- 数据类型 *指针变量 = 数组名;
-
- // 指针加数组下标,修改具体数组元素
- *(指针变量 + 数组下标) = 常量或者变量;
代码示例:
- #include <stdio.h>
-
- int main()
- {
- // 定义数组
- int array[] = {1, 2, 3, 4, 5};
- // 定义指针并指向数组首地址
- int *ptr = array;
-
- // 通过数组下标访问元素,注意,不要下标不要超过了(数组长度 - 1)
- // 访问数组中第2个元素,相当于array[1]
- printf("数组第2个元素修改前的值是%d\n", *(ptr + 1));
-
- // 修改数组中第2个元素
- *(ptr + 1) = 10;
- printf("数组第2个元素修改后的值是%d\n", *(ptr + 1));
-
- return 0;
- }
指针加整数(假设为n),含义是从当前地址向下移动数据类型长度*n(相当于sizeof(数据类型) * n)的地方,运算的结果指针指向新的地址。注意,指针移动至非法的位置。
- #include <stdio.h>
-
- int main()
- {
- // 定义数组
- int array[] = {1, 2, 3, 4, 5};
- // 定义指针并指向数组首地址
- int *ptr = array;
-
- // 打印指针当前指向地址的内容
- printf("指针当前指向地址的内容是%d\n", *ptr);
-
- // 移动指针
- // 相当于访问数组中第3个元素
- ptr += 2;
- printf("移动两个位置后的指针当前指向地址的内容是%d\n", *ptr);
-
- return 0;
- }
相同类型指针可以比较大小
- #include <stdio.h>
-
- int main()
- {
- // 定义数组
- int array[] = {1, 2, 3, 4, 5};
-
- int *ptr1 = &array[1];
- int *ptr2 = &array[3];
-
- if (ptr1 > ptr2)
- {
- printf("ptr1指向地址高于ptr2指向地址\n");
- }
- else if (ptr1 < ptr2)
- {
- printf("ptr1指向地址低于ptr2指向地址\n");
- }
- else
- {
- printf("ptr1和ptr2指向相同空间\n");
- }
-
- return 0;
- }
相同类型的指针可以做减法,可以计算出它们之间相隔的元素个数。
- #include <stdio.h>
-
- int main()
- {
- // 定义数组
- int array[] = {1, 2, 3, 4, 5};
-
- int *ptr1 = &array[1];
- int *ptr2 = &array[3];
-
- printf("ptr1和ptr2之间相隔元素个数为%d\n", ((ptr1 > ptr2) ? (ptr1 - ptr2) : (ptr2 - ptr1)));
-
- return 0;
- }
相同类型的指针可以相互赋值,注意,void*类型除外。
- #include <stdio.h>
-
- int main()
- {
- // 定义数组
- int array[] = {1, 2, 3, 4, 5};
-
- int *ptr1 = &array[1];
- int *ptr2 = ptr1;
-
- printf("ptr1的地址是%p\n", ptr1);
- printf("ptr2的地址是%p\n", ptr2);
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。