Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何通过向数组添加数字来访问数组的元素';名称';,i、 e存储第一个元素的常量指针';谁的地址?_C_Arrays_Pointers - Fatal编程技术网

C 如何通过向数组添加数字来访问数组的元素';名称';,i、 e存储第一个元素的常量指针';谁的地址?

C 如何通过向数组添加数字来访问数组的元素';名称';,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

在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*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))
for
T*x
@noob:您仍然缺少指向原始类型指针的强制转换。否则,您将通过类型为
char
的左值访问对象表示,该左值虽然允许,但可能不是您想要的(并且肯定不等同于原始表达式)你能再解释一下第二段吗?指针如何指向地址后的整数元素?还有,为什么运行时不存在数组名?@Aryanpoonacha让我假设典型的环境:执行机器是普通计算机,RAM使用字节地址,地址用作指针。然后,移动到
n
之后的元素将
(指向的对象的大小)*n
添加到地址。数组名称在运行时被丢弃,因为它不需要:仅在执行过程中对象在内存中的位置是重要的。位置用数字表示(静态对象的内存地址和自动变量堆栈中的偏移量)。
<information on site>

double *p;
double balance[10];

p = balance;
</informationonsite>