例如
int (*pt)[4];
int target[3][4] = {{1,3,4,6},{2,4,5,8},{3,4,6,7}};
pt = target;
*pt = target[0];
为什么是“ [错误]无效的数组分配”
答案 0 :(得分:3)
int (*pt)[4]
声明pt
作为指向数组的指针。
C不允许分配数组;例如你做不到:
int a[4] = {1, 2, 3, 4};
int b[4];
b = a;
如果要复制数组,则需要使用循环,也可以使用memcpy
:
memcpy(pt, target[0], sizeof target[0]);
答案 1 :(得分:2)
在Barmar给出的出色回答中稍作添加,
int (*pt)[4];
声明一个指向int [4]数组的指针
int target[3][4] = {{1,3,4,6},{2,4,5,8},{3,4,6,7}};
声明一个数组int [4] 的数组(其中3个在普通2D数组中)
pt = target;
访问时{p}的转换为指向其第一个元素的指针。 (数组/指针转换)由于其第一个元素是int [4]的数组,因此将其转换为指向int [4] 的数组的指针。与target
类型兼容的。参见C11 Standard - 6.3.2.1 Other Operands - Lvalues, arrays, and function designators(p3)
pt
由于*pt = target[0];
是指向整数[4]的指针,因此当取消引用指针时,将剩下带有整数[4]的数组 -and数组不是左值且不可分配。 Id at (p1)。
答案 2 :(得分:1)
OP问了两个问题。
问题1
{{1}中的
*pt
和int (*pt)[2]
中的pt
之间有什么区别?
在此
int *pt
int (*pt)[4];
是一个指针,可以指向pt
整数数组。
假定4
整数-4
的数组
你可以
int arr[4] = {1,3,4,6};
在您的程序中
pt = &arr; //pt is now pointing to array arr.
这等同于
pt = target;
因为pt = &target[0];
是数组target
的第一个元素的地址:
1D
和target -> target + 0 -> &(*(target + 0) -> &target[0]
是target[0]
整数的数组。
请注意,4
的 type 是*pt
,当您在程序中使用int [4]
时,您将获得它指向的数组第一个元素的地址也是数组的基址:
*pt
考虑这个
*pt -> *pt + 0 -> &(*(*pt + 0)) -> &(*pt)[0]
输出:
#include <stdio.h>
int main (void)
{
int (*pt)[4];
int target[3][4] = {{1,3,4,6},{2,4,5,8},{3,4,6,7}};
pt = target; // pointer pt pointing to target[0] array
printf ("%p\n", (void *)*pt);
printf ("%p\n", (void *)&target[0][0]);
return 0;
}
在此陈述中,出现问题的第二 nd
# ./a.out
0x7ffee35389e0
0x7ffee35389e0
在这里,int *pt;
是指向整数的指针。
假设您拥有pt
整数数组-4
这样做的时候
int arr[4] = {1,3,4,6};
等效于
pt = arr;
因为
pt = *arr[0];
因此,arr -> arr + 0 -> &(*(arr + 0)) -> &arr[0]
将在指向的地址处给出值。
考虑以下示例:
*pt
输出:
#include <stdio.h>
int main (void)
{
int *pt;
int arr[4] = {1,3,4,6};
pt = arr;
printf ("%p\n", (void *)pt);
printf ("%p\n", (void *)arr);
printf ("%p\n", (void *)&arr[0]);
printf ("%d\n", *pt);
return 0;
}
问题2
为什么是“ [错误]无效的数组分配”
# ./a.out 0x7ffee86f0a00 0x7ffee86f0a00 0x7ffee86f0a00 1
请注意,*pt = target[0];
是指向pt
整数数组的指针。 4
-*pt
的类型。数组名称不是可修改左值,您不能分配给它。因此,编译器在此语句上给出了错误。