c - 数组指针的地址,&array

标签 c

<分区>

以下程序打印出 a 和 array 共享同一地址。 我应该如何理解这种行为? &arr 是指针arr 的地址,它包含10 个字符的起始地址吗?

#include <stdio.h>

int main()
{
    char arr[10] = {0};

    char* a = (char*)(&arr);

    *a = 1;

    printf("a=%p,arr=%p.\n", a, arr);
    printf("%d\n", arr[0]);
    return 0;
}

最佳答案

当你在 C 中分配一个数组时,你得到的是类似下面的东西:

          +---+ 
  arr[0]: |   |
          +---+
  arr[1]: |   |
          +---+
           ...
          +---+
arr[N-1]: |   |
          +---+

就是这样。没有为名为 arr 的对象预留单独的内存位置来存储数组第一个元素的地址。因此,数组第一个元素的地址 (&arr[0]) 与数组本身的地址 (&arr) 是相同的>).

除非它是 sizeof 或一元 & 运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,T 的 N 元素数组”类型的表达式 将被转换(“衰减”)为“指向 T 的指针”类型的表达式和值表达式的地址将是数组第一个元素的地址。

所以在第一个printf调用中表达式arr的类型是char [10];根据上面的规则,表达式“衰减”为 char * 类型,其值为 arr[0] 的地址。

在表达式&arr中,arr是一元&运算符的操作数,所以不进行转换;您得到的不是 char ** 类型的表达式,而是 char (*)[10] 类型的表达式(指向 char 的 10 元素数组的指针)。同样,由于数组第一个元素的地址与整个数组的地址相同,因此表达式 arr&arr 具有相同的

关于c - 数组指针的地址,&array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25626418/

相关文章:

c - 使用 C 在 SVG 中绘制切线图

c - 如何删除二维字符数组指针的一项

C:int 类型存储为 long long 类型时,技术上会发生什么?

字符仅被视为无效

c - 键盘信号处理,向回调处理函数添加参数(Ubuntu、intel)

c - 没有选项和数据的 TCP 段

c - 如何将 "unbreak"C 代码与 "Artistic Style"

c - 在 C 宏扩展期间,是否存在扩展为 "/*"的宏的特殊情况?

c - Roberts-Slaney-Bouras 整数 FFT 实现问题

java - 通过套接字从 Java 程序向 C 程序发送数据