使用C中的指针进行数组表示的各种方法

时间:2016-06-05 11:56:07

标签: c arrays pointers

我在C中试验数组和指针。这里

http://r4r.co.in/c/c_topics/c_array_basics/array_representation_in_memory.shtml

我读了那个

ar[2]=*(ar+(sizeof(datatype)*2));

然而,在C中编写以下测试程序后: -

#include<stdio.h>
#include<conio.h>

int main()
{
    int array[]={10,11,12,13,14};

    printf("\nArray:%d",array);
    printf("\nArray+4:%p",array+4);
    printf("\nArray+(sizeof(int)*4):%p",array+((sizeof(int))*4));
    printf("\n*(Array+4):%d",*(array+4));
    printf("\n*(Array+(sizeof(int)*4)):%d",*(array+((sizeof(int))*4)));

    getch();
    return 0;
}

我得到以下输出: -

Array:2686700
Array+4:0028FEFC
Array+(sizeof(int)*4):0028FF2C
*(Array+4):14
*(Array+(sizeof(int)*4)):4214784

所以从这里我得出结论

array[4]=*(array+(sizeof(int)*4));

不是工作而是表达

array[4]=*(array+4);

是真的。

我的结论是对还是错?如果是错的那么为什么会这样呢?

语言:-C 版本:-gcc(tdm-1)4.7.1 平台:-Windows 8.1

编辑:
1)。改变了以下几行:
((sizeof(int*))*4((sizeof(int))*4
2)。将标题更改为:使用C中的指针进行数组表示的各种方式 3)。固定语法。

4 个答案:

答案 0 :(得分:1)

E1[E2]被定义为等同于*((E1)+(E2))N1570 6.5.2.1),因此array[4]始终为*(array+4),因为它有效范围。

在指向整数的指针之间使用的

+运算符被定义为在指针指向的内容后给出(整数)元素(不是字节)。 (N1570 6.5.6),如果*(array+(sizeof(int)*4)) sizeof(int) >= 2超出范围,移动指针超出范围将调用未定义的行为

另请注意,您应该为printf()使用正确的格式说明符,否则您将调用未定义的行为

#include<stdio.h>

int main(void)
{
    int array[]={10,11,12,13,14};

    printf("\nArray:%p",(void*)array);
    printf("\nArray+4:%p",(void*)(array+4));
    printf("\nArray+(sizeof(int)*4):%p",(void*)(array+((sizeof(int*))*4))); /* maybe undefined behavior */
    printf("\n*(Array+4):%d",*(array+4));
    printf("\n*(Array+(sizeof(int)*4)):%d",*(array+((sizeof(int*))*4))); /* maybe undefined behavior */

    return 0;
}

答案 1 :(得分:0)

您最初误解了添加与指针一起使用的方式。指针是一个地址加上它指向的对象类型。因此,add知道它必须添加sizeof()个字节。

请参阅 Difference Between *(Pointer + Index) and Pointer[]this

另外,在声明中

printf("\nArray+(sizeof(int)*4):%p",array+((sizeof(int*))*4));

您实际上在使用sizeof(int*)而不是sizeof(int)。 同样在另一条线上。所以,你不打印你认为的那样。

还请注意interesting facts about commutation

答案 2 :(得分:0)

指针算法将指向类型的大小考虑在内。给定p类型的对象的指针T,表达式p+1将给出类型为T的下一个对象的地址。因此,如果p == 0x8000p+1可能会产生0x80010x80020x80040x8008或任何其他值,具体取决于{的大小{1}}。

因此,T;从该地址获取地址a[i] == *(a + i),偏移a 元素非字节)并取消引用结果。您不需要将偏移量乘以指向类型的大小。

答案 3 :(得分:0)

 printf("\n*(Array+(sizeof(int)*4)):%d",*(array+((sizeof(int*))*4)));

应该是

printf("\n*(Array+(sizeof(int)*4)):%d",*(array+((sizeof(int))*4)));

以上只有在每个字节处理int数组时才有效,我认为这不太可能。