你的有趣问题有两点:
- 指针操作如何工作?
- arr 和 &arr 有什么区别?
1:指针操作如何工作?
试试下面的代码:
#include <stdio.h>
#include <inttypes.h>
int main(int argc, char **argv) {
int simpleInt= 10 ;
printf("Output 1 : %p %p \n", &simpleInt+1, &simpleInt); // 61FE20 and 61FE1C
printf("Output 2 : %lld \n", &simpleInt+1 - &simpleInt); // 1
printf("Output 3 : %lld\n", (uint64_t)(&simpleInt+1) - (uint64_t)(&simpleInt)); // 4
}
输出1:很明显,两个打印的指针值之差是4
输出 2:您正在对 int * 执行操作。 1 被添加到 int * 类型的操作数,并在 int * 类型的操作数被减去之后。从“int * 的角度”(如果我可以这样简化的话),只添加了一个。因此,输出为 1。
输出 3:减法的每个操作数都被强制转换为 long long unsigned int。所以减法是对整数而不是指针进行的。正如预期的那样,输出为 4。
2。 arr 和 &arr 有什么区别?
让我们看看下面的代码
int arr[5] = {10, 20, 30, 40, 50};
printf("Output 1 : %p %p %p \n", arr, &arr, *(&arr) ); //Seems to be the same thing but NOT. int*, int*[5], int*, respectively
// printf("%lld\n", arr - &arr ); // compilation error : int * and int(*)[5]
printf("Output 2 : %lld\n", arr - *(&arr) );
//printf("%lld\n", &arr - *(&arr) ); // compilation error : int(*)[5] and int *
printf("Output 3 : %p %p %p \n", (arr + 1), (&arr + 1), *(&arr + 1) ); // +4, +20, +20
printf("Output 4 : %lld\n", *(&arr + 1) - arr);
printf("Output 5 : %lld\n", (uint64_t)(*(&arr + 1)) - (uint64_t)(arr));
输出 1:值相同,但参数类型不同。这一点非常重要。数组的名称是指向其第一个元素的指针。在您的情况下,您的数组是int 的数组,因此arr 是指向int 的指针:int*。 &arr 是变量arr 的地址,它是一个由 5 个整数组成的数组。所以&arr 的类型是int(*)[5]。而*(&arr)的类型是int*
输出 2:由于上面的解释,一些行给出了编译错误。您可以对相同的指针类型进行操作:arr 和 *(&arr)
输出 3:根据增加的指针类型,获得 +4 或 +20。 +20 因为 1 被添加到 int(*)[5] 类型的操作数:5 * 4 (sizeof int = 4)
输出 4 和 5 :在第一点(指针操作)中,您正在以 int* 作为操作数执行减法