打印C阵列的地址

时间:2015-07-19 10:08:45

标签: c arrays pointers

以下问题可能对社区重复,但有时您需要在脑海中提出确切的问题才能正确理解问题。我试图彻底了解指针。当主持人说使用& pointername [下标]打印数组的每个元素的地址时,我正在观看视频。我的问题是为什么不只是指针。在执行j ++之后的下面的代码中,J不会有数组元素的地址吗?我为什么要使用& j [k]? & j [k],j(如果有)

之间有什么区别?
#include <stdio.h>

void main()
{
    int i[] = {1, 2, 3, 4, 5}, *j, k;
    j = i;
    for (k = 0; k < 5; k++)
    {
        printf("%p, %p, %p\n", &j[k], j, i);
        j++;
    }
}

谢谢,

萨哈娜

4 个答案:

答案 0 :(得分:3)

你是对的:

  • 使用作业j=ij指向数组i中的第一个元素。从现在起,j[k]将指向与i[k]相同的内存位置。
  • 使用j[k],您将检索数组中k个单元格的数据。所以j[k]是一个int。
  • 如果您想获取地址,则必须在其前面放置&

答案 1 :(得分:3)

在大多数情况下,当您在C中引用数组时,您自动获得的是指向数组第一个元素的指针。换句话说,当你写了

cmake_minimum_required(VERSION 2.8)
OPTION(FOO "Foo Option" OFF)
SET(FOO ON)                   # Don't do this
MESSAGE("FOO? " ${FOO})

完全就像你写过

一样
j = i;

这进一步意味着当你写作

j = &i[0];

它完全等同于

i[k]

这意味着

*(i + k)

将始终等于

&i[k]

在您的计划中,i + k /* or &i[0] + k */ 等于j[k]也是如此,这意味着*(j + k)等于&j[k]

看起来您的程序正在尝试演示这些等效性,但这会让您感到困惑,因为您要j + k j递增j。这是您的程序版本,应该更清楚地说明发生了什么。 (除此之外,我已将数组的名称更改为k,因为“i”是数组的非常令人困惑的名称!同样,我已更改aj。)

p

答案 2 :(得分:1)

在C中,&ptr[index] 完全ptr+index甚至&index[ptr]完全相同 并且数组衰减成指针,特别是在将它们作为参数传递时(例如传递给printf)。

准确阅读您最喜爱的C编程书中衰减数组的含义。请注意,sizeof在应用于数组或指针时不同。因此,在我的Linux / x86-64桌面上使用int arr[5];:当传递arr作为参数时,它会被衰减为指针,因此与&arr&arr[0]相同;但sizeof(arr)为20,sizeof(&arr)为8(有些sizeof(ptr)之后为int*ptr = &arr[3];)且sizeof(arr[0])为4。

答案 3 :(得分:0)

简单地

#include <stdio.h>

int main() {
    int i[] = { 1, 2, 3, 4, 5 }, j;
    for (j = 0; j < 5; ++j)
        printf("%p\n", &i[j]);
    return 0;
}

<强>输出

0xbff22d8c
0xbff22d90
0xbff22d94
0xbff22d98
0xbff22d9c