C中使用指针表示数组的各种方法
我在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(
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)));