C 如何通过向数组添加数字来访问数组的元素';名称';,i、 e存储第一个元素的常量指针';谁的地址?
在C语言中,我学到了可以使用指针访问数组的元素,方法是将地址增加数组数据类型的内存大小。对于存储整数的数组AC 如何通过向数组添加数字来访问数组的元素';名称';,i、 e存储第一个元素的常量指针';谁的地址?,c,arrays,pointers,C,Arrays,Pointers,在C语言中,我学到了可以使用指针访问数组的元素,方法是将地址增加数组数据类型的内存大小。对于存储整数的数组A int *ptr = &A[0]; for(int i = 0; i<3; i++) { printf("%p\n", *ptr) ptr++ // here it's +4 cause int } int*ptr=&A[0]; 对于(int i=0;i编译器知道您指向的是双数组,因此:*(x+4)[其中x是双数组]是*(double*)((char*)x+4*sizeo
int *ptr = &A[0];
for(int i = 0; i<3; i++)
{
printf("%p\n", *ptr)
ptr++ // here it's +4 cause int
}
int*ptr=&A[0];
对于(int i=0;i编译器知道您指向的是双数组,因此:*(x+4)
[其中x是双数组]是*(double*)((char*)x+4*sizeof(double))
解释:当使用类型a的指针时,语句a*p=SOME_ADDRESS;p++
使p向前移动sizeof(a)
字节,意味着它已从地址X移动到地址X+sizeof(a)(字节)数组不是指针,数组名称与数组一样也不是指针。在表达式中使用数组时,可以自动将数组转换为指针,但有一些例外情况除外,如一元&
运算符的操作数、sizeof
运算符等。除调试信息外,数组名称将在运行时消失
(指针)+(整数)
定义为在6.5.6加法运算符中(指针)
指向的元素之后指向(整数)
元素的指针。您不必考虑地址
您不能取消引用(*(balance+4))
,这是类型的double
(*(balance+4))
相当于balance[4]
(请参见N1570 6.5.2.1数组订阅)。Kernighan和Ritchie在他们的《C编程语言》一书中对此进行了很好的解释。为什么不给自己一份副本呢?你试过了吗?当向p
添加x
时,一个指向T
类型的指针,新值变成p+x*sizeof(T)
“数组的第一个元素是一个常量指针”-错。第一个、第二个和所有其他元素都是您声明为类型的元素。请提供一个。balance
显然是一个数组。数组不是指针!正如@Bathsheba所写的:如果您不理解您的导师(或他胡说八道),请阅读一本C语言书。K&R可能是一个很好的补充,但请注意,它教授的是中世纪C语言,而不是现代C语言(C99,分别为C11).@Olaf My bad,我写这部分的时候没有思考,意思是写数组的名称是一个常量指针。@Aryanpoonacha结果是对的,但你的理由是错的。数组可以转换为指针,但数组不是指针。请问你想用*balance
来表达什么?如果使用co,这是一个double
.hmm要解释这个,那么这个(*(balance+sizeof(pointee)))
应该是(*((char*)balance)+sizeof(pointee))
@alk-ohh,对不起。你完全正确。试图简化解释有时会让我写一些愚蠢的事情。你的例子不正确:*(x+4)
是*(T*)((char x+4*sizeof(T))
forT*x
@noob:您仍然缺少指向原始类型指针的强制转换。否则,您将通过类型为char
的左值访问对象表示,该左值虽然允许,但可能不是您想要的(并且肯定不等同于原始表达式)你能再解释一下第二段吗?指针如何指向地址后的整数元素?还有,为什么运行时不存在数组名?@Aryanpoonacha让我假设典型的环境:执行机器是普通计算机,RAM使用字节地址,地址用作指针。然后,移动到n
之后的元素将(指向的对象的大小)*n
添加到地址。数组名称在运行时被丢弃,因为它不需要:仅在执行过程中对象在内存中的位置是重要的。位置用数字表示(静态对象的内存地址和自动变量堆栈中的偏移量)。
<information on site>
double *p;
double balance[10];
p = balance;
</informationonsite>