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

C中使用指针表示数组的各种方法,c,arrays,pointers,C,Arrays,Pointers,我在C语言中试验数组和指针 我读到了 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(

我在C语言中试验数组和指针

我读到了

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[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). 固定语法。

E1[E2]
定义为等同于
*((E1)+(E2))
(6.5.2.1),因此
数组[4]
始终是
*(数组+4)
,只要它在有效范围内

+
在指向整数的指针之间使用的运算符定义为在指针所指向的内容之后给出(整数)元素(而不是字节)。(N1570 6.5.6),因此如果
sizeof(int)>=2,则
*(数组+(sizeof(int)*4))
将超出范围,并且将指针移动到超出范围将调用未定义的行为

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

#包括
内部主(空)
{
int数组[]={10,11,12,13,14};
printf(“\n数组:%p”,(void*)数组);
printf(“\n数组+4:%p”,(void*)(数组+4));
printf(“\nArray+(sizeof(int)*4):%p”,(void*)(array+((sizeof(int*))*4));/*可能是未定义的行为*/
printf(“\n*(数组+4):%d”,*(数组+4));
printf(“\n*(Array+(sizeof(int)*4)):%d”,*(Array+((sizeof(int*))*4));/*可能是未定义的行为*/
返回0;
}

您最初误解了加法处理指针的方式。指针是地址加上它指向的对象类型。因此,加法器知道它必须添加
sizeof()
字节

看 及

另外,在声明中

printf("\nArray+(sizeof(int)*4):%p",array+((sizeof(int*))*4));
实际上,您使用的是
sizeof(int*)
而不是
sizeof(int)
。 另一行也是如此。所以,你不是在打印你认为你是什么


另请注意。

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

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

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

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

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

注意
数组的数据类型。指针算术涉及指针的数据类型。请使用
%p
打印指针。是的,对于任何数组(或指针)
a
和索引
i
,表达式
a[i]
*(a+i)
完全相同。甚至在C规范中也是如此。
ar[2]=*(ar+(sizeof(datatype)*2))与数组[2]=*(数组+(sizeof(int)*4)):为什么在第一个代码段中使用
2
,在第二个代码段中使用
4
?打字错误或意图-S@alk对不起,这是我的错误,我正在纠正它的指针算法:将
T
类型的指针递增
N
将指针递增
N*sizeof(T)
字节
void
-指针不能是指向此算术运算的操作数。
 printf("\n*(Array+(sizeof(int)*4)):%d",*(array+((sizeof(int*))*4)));
printf("\n*(Array+(sizeof(int)*4)):%d",*(array+((sizeof(int))*4)));