当使用数组指针时,加上括号是为了明确指针的优先级。
在 C 语言中,*(解引用操作符)的优先级比[](数组下标操作符)更高。因此,如果不加括号,会先执行解引用操作,而不是按照我们期望的方式来操作数组。
让我们通过一个简单的示例来说明这个问题:
int* ptr[5]; // 声明一个包含5个整型指针的数组
在这个声明中,我们声明了一个指针数组,其中的每个元素都是 int*
类型的指针。这是一个正常的数组声明,没有什么需要特别关注的。
现在,让我们看看以下情况:
int (*ptr)[5]; // 声明一个指向包含5个整型元素的数组的指针
在这个声明中,我们声明了一个指向包含5个整型元素的数组的指针。我们在指针名称 ptr
周围加上了括号,以明确指针的优先级。
这样,我们就可以通过解引用指针并使用数组下标操作符,像 (*ptr)[i]
这样来访问数组中的元素。
所以,加上括号是为了避免由于优先级问题而产生错误的解析。
(三)指针数组:
指针数组是一个数组,其中的每个元素都是指针类型。它是指针和数组的结合,允许我们存储一组指针,每个指针可以指向不同的数据或对象。是一个数组,其中的每个元素都是指针类型。它是指针和数组的结合,允许我们存储一组指针,每个指针可以指向不同的数据或对象。
由上面的数组声明通式我们可以推出指针数组的声明公式:
数据类型 *数组名称[元素个数];
举例:
#include <stdio.h>
int main() {
int num1 = 10, num2 = 20, num3 = 30;
int* ptr_array[3]; // 声明一个包含3个整型指针的指针数组
ptr_array[0] = &num1; // 将指针指向 num1 的地址
ptr_array[1] = &num2; // 将指针指向 num2 的地址
ptr_array[2] = &num3; // 将指针指向 num3 的地址
printf("指针数组的元素为: ");
for (int i = 0; i < 3; i++) {
printf("%d ", *(ptr_array[i])); // 通过指针访问所指向的元素
}
return 0;
}
运行结果:
指针数组的元素为: 10 20 30
(四)数组指针:
数组指针是一个指向数组的指针,也可以看作是指向数组第一个元素的指针。它保存了数组的内存地址,从而可以通过指针来访问和操作数组中的元素。
由上面的数组声明通式我们可以推出指针数组的声明公式:
数据类型 (*指针名称)[元素个数];
举例:
#include <stdio.h>
int main() {
int numbers[3][4] = {{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}}; // 定义一个3行4列的二维整型数组
int (*ptr)[4]; // 声明一个指向包含4个整型元素的数组的指针
ptr = numbers; // 将指针指向二维数组的第一行的地址
printf("二维数组元素为: \n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
printf("%d ", ptr[i][j]); // 通过指针访问二维数组元素
}
printf("\n");
}
return 0;
}
运行结果:
二维数组元素为:
1 2 3 4
5 6 7 8
9 10 11 12