为什么在C中可以使用以下内容?

时间:2011-12-11 18:59:00

标签: c pointers

为什么在C中可以使用以下内容?

#include <stdio.h>
#include <process.h>

main()
{
    int array[][3] = {11, 22, 33, 44, 55, 66, 77, 88, 99};

    int * pArr = &array;
    int i=0;

    printf("Addr\tValue\n");
    for(i=0 ; i<9 ; i++)
    {
        printf("%d\t%d\n", &pArr[i], pArr[i]);
    }

    system("PAUSE");
}

输出

Addr    Value
2358344 11
2358348 22
2358352 33
2358356 44
2358360 55
2358364 66
2358368 77
2358372 88
2358376 99

enter image description here

3 个答案:

答案 0 :(得分:2)

这取决于你的意思。这是一种可能的解释:

int x[5][10];  // 2D array
int (*p)[5][10] = &x;  // Pointer to 2D array

(*p)[3][2] = 1;  // Dereferencing pointer

这是另一个:

int x[5*10];  // 1D array
int *p = x;   // Pointer to first element of array

p[3*10+2] = 1;  // Dereferencing pointer

这是另一个:

int **p;    // Pointer to pointer
p = malloc(sizeof(*p) * 5);  // Create array of pointers
for (int i = 0; i < 5; i++)
{
    p[i] = malloc(sizeof(p[i]) * 10);  // Create array of ints
}

p[3][2] = 1;  // Dereferencing pointer

...

// Clearup
for (int i = 0; i < 5; i++)
{
    free(p[i]);
}
free(p);

答案 1 :(得分:0)

你不能;指针只会告诉你在哪里看,而不是目标是什么。

以二维数组为例:

1 2 3 4
5 6 7 8
9 0 1 2

这将在内存中表示为

1 2 3 4 5 6 7 8 9 0 1 2

只有当您知道这是int[3][4]时,才能再次获得该数组。 C不存储它是int[2][6]还是int[3][4]

如果您知道数组的尺寸,就会变得简单,因为您可以简单地分配它。

答案 2 :(得分:0)

int **pointer;

指针保存int *元素集合的第一个元素的地址。

第一个元素是int *指针。

该元素可能指向实际的int

因此,指针指向指针集合的第一个元素,其中第一个元素指向int。如果向pointer添加1,则会得到可能指向int

的下一个指针

这就是“2D”在C指针算术中的含义。