我对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]
,因此它很有用,但是它如何工作?
谢谢!
答案 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]
。