Int (*p)[10] 与 Int *p[10]

1. int (*p)[10]

含义
  • p 是一个 指向数组的指针,该数组包含 10 个 int 类型的元素。
  • 这种声明方式中的 (*p)[10] 是一个数组类型,表示一个包含 10 个整数的数组。
结构解析
  • *p 表示 p 指向的内容是一个数组。
  • (*p)[10] 表示 p 指向的是一个包含 10 个整数的数组,数组的类型是 int[10]
使用场景
  • 你通过 p 来访问数组,而不是访问数组的单个元素。
  • p 是一个指向数组的指针,因此我们可以通过 (*p)[i] 来访问数组中的元素。
示例代码
#include <stdio.h>

int main() {
    int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};  // 声明一个数组
    int (*p)[10] = &arr;  // p 是一个指向包含 10 个 int 的数组的指针
    
    // 访问数组中的元素
    printf("p[0] = %d\n", (*p)[0]);  // 访问 arr[0],输出 1
    printf("(*p)[9] = %d\n", (*p)[9]);  // 访问 arr[9],输出 10
    
    return 0;
}
  • (*p)[0]:首先通过 p 访问整个数组,然后使用下标 0 获取数组的第一个元素。

2. int *p[10]

含义
  • p 是一个 数组,包含 10 个 指向 int 类型的指针
  • p[10] 是一个包含 10 个元素的数组,每个元素都是 int*(即指向 int 的指针)。
结构解析
  • p[10] 是一个数组,包含 10 个元素。
  • 每个元素 p[i] 都是一个指针,指向一个 int 类型的变量。
使用场景
  • 你通过 p[i] 来访问数组中的指针,然后使用 *p[i] 来访问 int 类型的数据。
  • p 本身并不是一个指向数组的指针,而是一个数组,数组中的每个元素都是指向 int 的指针。
示例代码
#include <stdio.h>

int main() {
    int a = 5, b = 10, c = 15;
    int *p[10];  // p 是一个数组,包含 10 个 int 指针
    
    p[0] = &a;  // p[0] 指向 a
    p[1] = &b;  // p[1] 指向 b
    p[2] = &c;  // p[2] 指向 c
    
    // 通过指针访问数据
    printf("p[0] = %d\n", *p[0]);  // 输出 a 的值,5
    printf("p[1] = %d\n", *p[1]);  // 输出 b 的值,10
    printf("p[2] = %d\n", *p[2]);  // 输出 c 的值,15
    
    return 0;
}
  • *p[0]p[0] 是指向 a 的指针,通过解引用 *p[0] 来获取 a 的值。

区别总结:

1. 类型上的区别
  • int (*p)[10]

    • p 是一个指针,指向一个包含 10 个整数的数组,类型为 int[10]
    • *p 是一个数组,数组包含 10 个 int 元素。
  • int *p[10]

    • p 是一个数组,数组有 10 个元素,每个元素是一个指向 int 的指针,即类型为 int*
    • p[i] 是指向 int 的指针,可以通过 *p[i] 来访问指针所指向的整数。
2. 使用方式上的区别
  • int (*p)[10]
    • p 是一个指向数组的指针,访问方式是通过 (*p)[i] 来访问数组中的元素。
    • 主要用于操作一个大的数组(包含多个元素的数组)。
  • int *p[10]
    • p 是一个数组,包含多个指针。每个元素是一个指向 int 的指针,访问方式是通过 p[i] 获取指针,再通过 *p[i] 解引用来访问数据。
    • 主要用于处理多个 int 类型变量的指针数组。
3. 内存结构上的区别
  • int (*p)[10]
    • p 指向一个数组,因此只有一个指针,指向的是整个数组。
    • 内存上,它只占用一个指针的空间(通常是 4 或 8 字节),指向一个数组。
  • int *p[10]
    • p 是一个数组,数组的每个元素是一个指针,因此总共需要 10 个指针变量的空间。
    • 内存上,它占用的是 10 个指针的空间(通常是 40 或 80 字节,具体取决于指针大小)。

总结

  • int (*p)[10]p 是一个指向数组的指针,指向一个包含 10 个 int 元素的数组。
  • int *p[10]p 是一个数组,包含 10 个指向 int 的指针。

这两种声明方式的用途和内存结构有很大区别,取决于你需要处理的数据类型和结构。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值