int(* pt)[2]中的* pt和int * pt中的pt有什么区别?

时间:2019-09-29 03:09:15

标签: c

例如

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

为什么是“ [错误]无效的数组分配”

3 个答案:

答案 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}中的*ptint (*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的类型。数组名称不是可修改左值,您不能分配给它。因此,编译器在此语句上给出了错误。