You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

int (*pt)[2]中*pt与int *pt中pt的区别及数组赋值报错问题

咱们一个一个来拆解你的问题,都是C语言里指针和数组的经典坑,搞懂了能帮你理清不少类型逻辑~

问题1:int (*pt)[2] 中的 *pt 与 int *pt 中的 pt 有什么区别?

先把两个声明的本质搞清楚:

  • int *pt:这是一个指向单个int变量的指针。pt本身存的是某个int的地址,比如int a=5; pt=&a;,此时*pt就等价于a,是个int值。
  • int (*pt)[2]:这是一个指向「包含2个int的数组」的指针。这里的pt存的是一个长度为2的int数组的地址,而*pt代表的就是这个被指向的数组本身。

再具体说两者的核心区别:

  • 类型完全不同:int *pt里的pt类型是int *(指向int的指针);而int (*pt)[2]里的*pt,原始类型是int [2](长度为2的int数组),虽然在表达式里它会自动退化为int *(指向数组第一个元素的指针),但本质上它是数组,不是单纯的指针。
  • 操作逻辑不一样:对int *pt的pt解引用(*pt)得到的是单个int值;对int (*pt)[2]的*pt,你可以用sizeof(*pt)得到2*sizeof(int),这明显是整个数组的大小,而不是单个int的大小。
  • 指针加减的步长不同:int *类型的指针加1,会跳sizeof(int)字节;而int (*)[2]类型的指针加1,会跳2*sizeof(int)字节——因为它指向的是整个数组,一步就要跨过整个数组的长度。
问题2:为什么示例代码会出现「[Error] invalid array assignment」错误?

先把你的代码贴出来方便分析:

int (*pt)[4]; 
int target[3][4] = {{1,3,4,6},{2,4,5,8},{3,4,6,7}}; 
pt = target; 
*pt = target[0]; 

首先,pt = target;这行是没问题的:target是二维数组,它会自动退化为指向第一个一维数组(也就是target[0],类型是int [4])的指针,类型正好是int (*)[4],和pt的类型匹配,所以赋值合法。

问题出在*pt = target[0];这一行!要知道:C语言里数组是不能直接赋值的。咱们拆解两边的类型:

  • *pt:它是pt指向的那个int [4]数组,是数组类型;
  • target[0]:同样是int [4]数组类型,虽然在表达式里会退化为int *,但本质还是数组。

C语言不支持把一个数组直接赋值给另一个数组,就像你写int a[4], b[4]; a = b;也会报错一样——数组名是不可修改的左值,没法作为赋值操作的左 operand。

那如果想把target[0]的内容拷贝到*pt指向的数组里,该怎么做?有两种常用方法:

  1. 用循环逐个元素赋值:
for (int i = 0; i < 4; i++) {
    (*pt)[i] = target[0][i];
}
  1. 用memcpy函数批量拷贝(记得包含头文件<string.h>):
#include <string.h>
memcpy(*pt, target[0], sizeof(target[0]));

这样就能完成你想要的内容复制啦~

内容的提问来源于stack exchange,提问作者Absolutelyrun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:45:11