分享

指针和数组的纠缠

 云深无际 2025-01-05 发布于内蒙古
数组名表示数组的起始地址,是一个常量地址。
在大多数表达式中,数组名会被隐式转换为指向数组第一个元素的指针。

指针是一个变量,用于存储某个地址,可以通过赋值改变其指向的内存位置

  1. 数组名在大多数上下文中会退化为指针,表示数组首元素的地址。
  2. 数组名和指针都可以用下标访问数组元素。

数组名可以像指针一样,通过下标操作符([])访问元素:

int arr[5] = {1, 2, 3, 4, 5};printf("%d\n", arr[0]);       // 输出 1printf("%d\n", *(arr + 1));   // 输出 2
  1. arr[1] 等价于 *(arr + 1)。
  2. 这里的 arr 被解释为指向数组第一个元素的指针。

数组是一个连续的内存块,而指针只是一个存储地址的变量。

int arr[3] = {1, 2, 3};int* ptr = arr;

printf("%p\n", (void*)&arr); // 数组的地址printf("%p\n", (void*)&ptr); // 指针变量的地址printf("%p\n", (void*)ptr); // 指针指向的地址
  1. &arr 表示整个数组的地址。arr是数组的名字
  2. &ptr 表示指针变量本身的地址。这个就是字面的意思,指针是一个内存的地址,那这个地址本身也有地址。
  3. ptr 和 arr 的值相同,但含义不同。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多