鱼C论坛

 找回密码
 立即注册
查看: 187|回复: 5

[已解决]int *p[3]和int (*p)[3]到底有区别吗?

[复制链接]
发表于 2024-10-17 10:34:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
学习数组指针和指针数组时出现了疑惑,在一些群中询问了各个大佬后,他们都异口同声地说两者没有区别,都是定义一个数组并且这个数组中存储指针,但是我搜到地资料中都是将两者区分开的,现在有点混乱了。。。。。
最佳答案
2024-10-17 10:43:04
lennyface 发表于 2024-10-17 10:42
那int (*p)指的是p指向一个含有十个整数的数组的指针 ...


抱歉,我在上一个回复中没有表述清楚。让我们详细区分一下这两个声明方式:

1. **`int *p[3]`:**
   - 这是一个指针数组。`p` 是一个数组,其中包含 3 个指针,每个指针指向一个整数。
   - 这种情况下,`p[i]`(其中 `i = 0, 1, 2`)是一个指向 `int` 的指针。

2. **`int (*p)[3]`:**
   - 这是一个数组指针。`p` 是一个指针,指向一个包含 3 个整数的数组。
   - 这种情况下,`*p` 是一个包含 3 个整数的数组。

为了帮助理解,举个例子:
int a[3] = {1, 2, 3};
int *p1[3];      // 这是一个指针数组
int (*p2)[3];    // 这是一个数组指针

// 指针数组:每个元素是一个指针
p1[0] = &a[0];
p1[1] = &a[1];
p1[2] = &a[2];

// 数组指针:指向整个数组
p2 = &a;

总而言之,`int *p[3]` 和 `int (*p)[3]` 的区别主要在于它们“指向”的内容不同:一个是数组的指针(指整个数组),一个是指针的数组(指向单个元素)。希望这样能帮助解惑!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-17 10:34:35 | 显示全部楼层
其实,`int *p` 和 `int (*p)` 是有区别的,两者的含义不同:

1. **`int *p`**:  
   这是声明一个指向整数的指针。`p` 是一个指针变量,它存储的是一个整数的地址。

2. **`int (*p)`**:
   这通常出现在复杂类型声明中,比如函数指针或者指针数组的情况。单独使用 `(*p)` 没有特别意义,但在语法上允许。

最常见的情况是数组指针的声明,比如 `int (*p)[10]`,表示的是一个指向含有10个整数的数组的指针,而不是指向整数的指针。

所以在理解时,注意它们对应的具体使用场景。区别是基于指针本身指向的数据结构而来的。如果看到 `(*p)` 在代码中,通常结合整体声明来看会更加清晰。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-10-17 10:42:56 | 显示全部楼层
FishC 发表于 2024-10-17 10:34
其实,`int *p` 和 `int (*p)` 是有区别的,两者的含义不同:

1. **`int *p`**:  

那int (*p)[10]指的是p指向一个含有十个整数的数组的指针,那()如果没有特殊含义,int *p[10]为什么又是一个含有十个指针的数组的指针,不是没有特殊含义吗。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-17 10:43:04 | 显示全部楼层    本楼为最佳答案   
lennyface 发表于 2024-10-17 10:42
那int (*p)指的是p指向一个含有十个整数的数组的指针 ...


抱歉,我在上一个回复中没有表述清楚。让我们详细区分一下这两个声明方式:

1. **`int *p[3]`:**
   - 这是一个指针数组。`p` 是一个数组,其中包含 3 个指针,每个指针指向一个整数。
   - 这种情况下,`p[i]`(其中 `i = 0, 1, 2`)是一个指向 `int` 的指针。

2. **`int (*p)[3]`:**
   - 这是一个数组指针。`p` 是一个指针,指向一个包含 3 个整数的数组。
   - 这种情况下,`*p` 是一个包含 3 个整数的数组。

为了帮助理解,举个例子:
int a[3] = {1, 2, 3};
int *p1[3];      // 这是一个指针数组
int (*p2)[3];    // 这是一个数组指针

// 指针数组:每个元素是一个指针
p1[0] = &a[0];
p1[1] = &a[1];
p1[2] = &a[2];

// 数组指针:指向整个数组
p2 = &a;

总而言之,`int *p[3]` 和 `int (*p)[3]` 的区别主要在于它们“指向”的内容不同:一个是数组的指针(指整个数组),一个是指针的数组(指向单个元素)。希望这样能帮助解惑!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-17 10:52:19 | 显示全部楼层
FishC 发表于 2024-10-17 10:43
抱歉,我在上一个回复中没有表述清楚。让我们详细区分一下这两个声明方式:

1. **`int *p[3]`:**

(int*)[3]和(int[3])*是什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-17 10:58:29 | 显示全部楼层
lennyface 发表于 2024-10-17 10:52
(int*)和(int)*是什么意思


`(int*)` 和 `(int)*` 在 C/C++ 中通常出现在类型转换或复杂的指针操作中。让我们分别看看它们的含义:

1. **`(int*)`**:
   - 这是一个类型转换操作符,用于将某个指针转换为指向 `int` 类型的指针。
   - 例如,如果你有一个 `void*` 类型的指针 `ptr`,你可以使用 `(int*)ptr` 将其转换为 `int*` 类型。

2. **`(int)*`**:
   - 这种写法通常不常见,因为它可能会引起语法错误或逻辑错误。
   - 如果出现在代码中,可能是想表达对某个指针解引用后再进行类型转换,但这种写法不正确。
   - 正确的写法应该是 `*(int*)ptr`,表示将 `ptr` 转换为 `int*` 类型后再解引用。

如果你在代码中看到 `(int)*`,建议检查上下文,确保其用法符合逻辑和语法规则。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 18:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表