C语言指针 int *p[10] int (*p)[10] int *p(int) int (*p)(int) 区别与举例

首先先来介绍下 int *p[10]和int(*p)[10]区别:
1.前者其实一个有十个指针的数组,该指针指向整型数据。其实也可以这样写(int *)p[10]。
2.后者则是一个指向有十个整型数据数组的指针,说白了*p是一个指针,指向一个数组的。(一维二维都可以)。

下来来举例说明下:
1.int *p[10]

#include <stdio.h>
#include <stdlib.h>
int main()
{

  int *p[10];
  int b=10,c=20;
  p[1]=&b;
  p[2]=&c;

  printf("%d %d",*p[1],*p
<think>嗯,用户问的是C语言int *p[3]和int (*p)[3]的区别。这两个声明看起来很像,但括号的位置不同,所以区别应该和运算符优先级有关。首先得回忆一下C语言的声明语法。 记得在C语言里,数组下标[]的优先级比指针*高。所以对于int *p[3],因为[]优先级高,p先和[3]结合,形成一个数组,数组的元素是指针,每个指针指向int类型。也就是说,这是一个指针数组,包含3个int类型的指针。 而int (*p)[3]的情况不同,括号改变了优先级,使得p先和*结合,所以p是一个指针,指向一个包含3个int元素的数组。这时候,p是一个数组指针,通常用于指向二维数组的行,比如int arr[2][3],p可以指向arr[0]或arr[1]。 接下来需要具体例子来验证。比如第一个情况,声明指针数组,可以给每个元素分配不同的int变量的地址。例如: int a=1, b=2, c=3; int *p[3] = {&a, &b, &c}; 这样每个p[i]都是指向int指针。 而第二个情况,声明数组指针的话,需要让p指向一个二维数组中的某一维。比如: int arr[2][3] = {{1,2,3}, {4,5,6}}; int (*p)[3] = arr; 此时p指向arr的第一个元素(也就是一个包含3个int的数组),p++会移动到下一个行,即arr[1]。 另外,用户提供的引用[1]里也提到了类似的例子,比如int *p[10]是指针数组,而int (*p)[10]是数组指针,这和我之前的理解一致。所以应该可以确定,两者的区别在于p的类型不同,一个是数组元素为指针,另一个是指针指向数组。 还需要注意内存分配和访问方式的不同。指针数组每个元素单独存放地址,而数组指针指向的是一整个数组,步长也是整个数组的大小。比如int (*p)[3],p+1的地址会增加3*sizeof(int)字节。 总结起来,两者的核心区别在于运算符优先级导致的不同类型声明:指针数组 vs 数组指针。应用场景也不同,指针数组常用于存储多个指针,而数组指针常用于处理多维数组的行。</think>### 关于 `int *p[3]` 和 `int (*p)[3]` 的区别 #### 1. **语法解析** - **`int *p[3]`** - `[]` 的优先级高于 `*`,因此 `p` 先 `[3]` 结合,表示一个**数组**。 - 数组的每个元素是 `int*` 类型的指针。 - 本质是**指针数组**,包含3个指向 `int` 的指针。 - 示例: ```c int a = 1, b = 2, c = 3; int *p[3] = {&a, &b, &c}; // p是数组,存储3个int指针 ``` - **`int (*p)[3]`** - 括号 `()` 改变了优先级,`p` 先 `*` 结合,表示一个**指针**。 - 指针指向一个包含3个 `int` 元素的**数组**。 - 本质是**数组指针**,常用于多维数组的访问。 - 示例: ```c int arr[2][3] = {{1,2,3}, {4,5,6}}; int (*p)[3] = arr; // p指向arr的第一行(一个包含3个int的数组) ``` #### 2. **内存模型对比** | 类型 | 内存结构 | 步长(`p+1`的偏移量) | |--------------------|-----------------------------------|-----------------------| | `int *p[3]` | 连续存放3个指针,每个指针占4/8字节 | 4/8字节(单个指针大小)| | `int (*p)[3]` | 指向一个长度为3的数组 | `3*sizeof(int)` | #### 3. **应用场景** - **`int *p[3]`(指针数组)** - 存储多个独立指针,例如字符串数组:`char *strs[3] = {"Hello", "World", "!"}`。 - 动态分配不同长度的内存块(如每行长度不同的二维数组)[^1]。 - **`int (*p)[3]`(数组指针** - 操作固定长度的二维数组,例如: ```c int arr[2][3] = {{1,2,3}, {4,5,6}}; int (*p)[3] = arr; printf("%d", p[1][2]); // 输出6(第二行第三列) ``` - 函数参数传递二维数组时使用(如 `void func(int (*p)[3])`)。 #### 4. **关键区别总结** | 特性 | `int *p[3]` | `int (*p)[3]` | |-------------------|----------------------------|----------------------------| | **类型** | 数组(元素为指针) | 指针(指向数组) | | **内存分配** | 存储多个指针 | 存储单个地址(指向数组首地址)| | **访问方式** | `p[i]` 是第i个指针 | `(*p)[i]` 是数组第i个元素 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值