我在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)。固定语法。
答案 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)
。
同样在另一条线上。所以,你不打印你认为的那样。
答案 2 :(得分:0)
指针算法将指向类型的大小考虑在内。给定p
类型的对象的指针T
,表达式p+1
将给出类型为T
的下一个对象的地址。因此,如果p == 0x8000
,p+1
可能会产生0x8001
,0x8002
,0x8004
,0x8008
或任何其他值,具体取决于{的大小{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数组时才有效,我认为这不太可能。