关于矩阵的指针算法的指针

时间:2019-10-04 19:39:44

标签: c pointers

我对C语言中的指针算术指针有疑问。
如果我们这样做

int ** ptr = 0x0;
printf("%p",ptr+=1);

输出将为ptr +(存储指针所需的字节数,在我的情况下为8)。
现在,如果我们声明一个矩阵:

int A[100][50];

A[0]是指针的指针。
A[0]+1现在将指向A [0] +(存储整数所需的字节数,在我的情况下为4)。
为什么“通常”添加了8个字节,现在又增加了4个? A[0]+1将指向A[0][1],因此它很有用,但是它如何工作?
谢谢!

1 个答案:

答案 0 :(得分:1)

请考虑将此程序运行在64位计算机上(准确地说是运行macOS Mojave 10.14.6的Mac,带有GCC 9.2.0):

#include <stdio.h>

int main(void)
{
    int A[100][50];
    printf("Size of void * = %zu and size of int = %zu\n", sizeof(void *), sizeof(int));
    printf("Given 'int A[100][50];\n");
    printf("Size of A       = %zu\n", sizeof(A));
    printf("Size of A[0]    = %zu\n", sizeof(A[0]));
    printf("Size of A[0][0] = %zu\n", sizeof(A[0][0]));
    putchar('\n');
    printf("Address of A[0]     = %p\n", (void *)A[0]);
    printf("Address of A[0] + 0 = %p\n", (void *)(A[0] + 0));
    printf("Address of A[0] + 1 = %p\n", (void *)(A[0] + 1));
    printf("Difference          = %td\n", (void *)(A[0] + 1) - (void *)(A[0] + 0));
    putchar('\n');
    printf("Address of &A[0]     = %p\n", (void *)&A[0]);
    printf("Address of &A[0] + 0 = %p\n", (void *)(&A[0] + 0));
    printf("Address of &A[0] + 1 = %p\n", (void *)(&A[0] + 1));
    printf("Difference           = %td\n", (void *)(&A[0] + 1) - (void *)(&A[0] + 0));
    return 0;
}

输出为:

Size of void * = 8 and size of int = 4
Given 'int A[100][50];
Size of A       = 20000
Size of A[0]    = 200
Size of A[0][0] = 4

Address of A[0]     = 0x7ffee5b005e0
Address of A[0] + 0 = 0x7ffee5b005e0
Address of A[0] + 1 = 0x7ffee5b005e4
Difference          = 4

Address of &A[0]     = 0x7ffee5b005e0
Address of &A[0] + 0 = 0x7ffee5b005e0
Address of &A[0] + 1 = 0x7ffee5b006a8
Difference           = 200

因此,可以推断出A[0]是由50个int组成的数组-它不是“指针指针”。不过,当在A[0] + 1之类的表达式中使用时,它会“衰减”为“指向int”的指针(指向数组元素类型的指针),因此A[0] + 1在整个数组中还有一个整数的值。

输出的最后一块显示数组的地址具有不同的类型,在int (*)[50]的情况下为A[0]