龙空技术网

在C语言中数组取地址注意事项:arr 和 &arr 有时是可以互换

西门剑心 324

前言:

眼前大家对“c语言中地址是多少位的”可能比较看重,大家都想要剖析一些“c语言中地址是多少位的”的相关资讯。那么小编在网上汇集了一些有关“c语言中地址是多少位的””的相关内容,希望看官们能喜欢,大家一起来了解一下吧!

在C语言中,当处理数组时,arr 和 &arr 有时看起来是可以互换的,因为它们通常指向相同的内存位置。然而,它们有不同的类型和含义:

arr (数组名):在大多数表达式中,arr 会退化为指向其第一个元素的指针。这意味着 arr 等同于 &arr[0]。退化后,它的类型是 int*,即指向数组第一个元素的指针。&arr (数组的地址):&arr 给出整个数组的地址。它的类型是 int (*)[10],即指向包含10个整数的数组的指针。

让我们通过一个例子来说明这些点:

#include <stdio.h>int main() {    int arr[10];        // 使用数组名打印数组的地址 (退化为指向第一个元素的指针)    printf("arr 的地址 (退化为指向第一个元素的指针): %p\n", (void*)arr);        // 打印数组第一个元素的地址    printf("&arr[0] 的地址: %p\n", (void*)&arr[0]);        // 使用 &arr 打印数组的地址    printf("&arr 的地址: %p\n", (void*)&arr);    // 打印 arr 和 &arr 的大小    printf("arr 的大小: %zu\n", sizeof(arr));    printf("&arr 的大小: %zu\n", sizeof(&arr));    return 0;}
arr 的地址 (退化为指向第一个元素的指针): 0x7ffee43b4a20&arr[0] 的地址: 0x7ffee43b4a20&arr 的地址: 0x7ffee43b4a20arr 的大小: 40&arr 的大小: 8
解释arr 的地址 (退化为指向第一个元素的指针):arr 退化为指向其第一个元素的指针,因此 arr 和 &arr[0] 给出的地址是相同的。两个打印语句显示相同的地址,因为 arr 和 &arr[0] 指向相同的位置。&arr 的地址 (数组的地址):&arr 给出整个数组的地址,它也是第一个元素在内存中的地址。打印的地址值对于 &arr、arr 和 &arr[0] 是相同的,因为整个数组从其第一个元素的地址开始。大小差异:sizeof(arr) 给出整个数组的大小,即 10 * sizeof(int)。如果 int 是 4 个字节,这将是 40 个字节。sizeof(&arr) 给出指向包含10个整数的数组的指针的大小。在64位系统上,通常是 8 个字节。关键点arr 和 &arr 都指向相同的内存地址,但代表不同的类型。arr 在表达式中退化为 int*,即指向数组第一个元素的指针。&arr 是指向整个数组的指针,类型为 int (*)[10]。arr 的大小是整个数组的大小,而 &arr 的大小是指针的大小。

标签: #c语言中地址是多少位的