Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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++ C/C+中的指针和数组+;_C++_C_Arrays_Pointers - Fatal编程技术网

C++ C/C+中的指针和数组+;

C++ C/C+中的指针和数组+;,c++,c,arrays,pointers,C++,C,Arrays,Pointers,嘿,伙计们,我正在努力记下一些指针和数组的理论知识。我希望有人能重申我对指针和数组概念的一些怀疑 假设我有这样的东西 int ia[] = {0,1,2,3,4,5}; ia[2]; // =2 int* ip = &ia[0]; // pointer ip gets the address of element 0 in array ia ip[2]; // ?? ip[2] = 42; // 这段代码的大部分显然是理论性的,但我对最后两行有点不确定。首先是说ip[2]和说ip

嘿,伙计们,我正在努力记下一些指针和数组的理论知识。我希望有人能重申我对指针和数组概念的一些怀疑

假设我有这样的东西

int ia[] = {0,1,2,3,4,5};
ia[2];  // =2

int* ip = &ia[0]; // pointer ip gets the address of element 0 in array ia
ip[2]; // ??
ip[2] = 42; // 
这段代码的大部分显然是理论性的,但我对最后两行有点不确定。首先是说ip[2]和说ip现在指向数组中的第二个元素一样吗?这是否等同于说*ip=ia[2]


我对最后一行也感到困惑。ip[2]=42;ip指向的对象的第二个元素,该地址的值是42?或者这是一种解引用的数组表示法?我只是有点搞不清楚到底发生了什么。

当你写
a[i]
时,它被翻译成
*(a+i)
其中a是基址(基本上是指针)

同样对于数组,基址与第一个元素的地址相同,因此
a[0]
的地址与
a
[即
a=&a[0]
]

因此,
ip[2]=42转换为
*(ip+2)=42

此外,*在该地址给出值
ip[2]=42
意味着
*(ip+2)=42
,即当您编写
a[i]
时,它被转换为
*(a+i)
,其中a是基地址(基本上是指针)

同样对于数组,基址与第一个元素的地址相同,因此
a[0]
的地址与
a
[即
a=&a[0]
]

因此,
ip[2]=42转换为
*(ip+2)=42

此外,*在该地址给出值
ip[2]=42
意味着
*(ip+2)=42
,即在
(ip+2)
ia[n]
是一种不同的书写方式
*(ia+n)
,因此
int*ip=&ia[0]
int*ip=ia
相同


您正在将
ia
分配给
ip
。当然,这也使得
ip[n]==ia[n]
对于
n
的所有值
ia[n]
是一种不同的书写方式
*(ia+n)
,因此
int*ip=&ia[0]
int*ip=ia
相同


您正在将
ia
分配给
ip
。当然,这也使得
ip[n]==ia[n]
对于
n

的所有值,下面创建一个名为ia的数组,并将数字存储在数组中的大括号中:

int ia[] = {0,1,2,3,4,5};
以下内容实际上不起任何作用:

ia[2];
但是,如果我接受上面的语句并进行如下更改,它会将值2赋给整数t。这是因为2是ia中的第三个元素,ia[2]引用ia中的第三个元素

t = ia[2];
如果您的原始ia声明被

int ia[] = {0,1,15,3,4,5};
那么你将把t赋值为15

以下内容将ia中索引2处的值更改为42:

ip[2] = 42;
现在,ia由{0,1,42,3,4,5}组成

这是因为ia[2]类似于说*(ia+2)。如果将ip分配给ia,则ip指向ia的第一个元素


类似地,ip[2]类似于说*(ip+2)。因此,更改ip[2]将更改ia[2],它们引用相同的内存块。

下面创建一个名为ia的数组,并将数字存储在数组中的大括号中:

int ia[] = {0,1,2,3,4,5};
以下内容实际上不起任何作用:

ia[2];
但是,如果我接受上面的语句并进行如下更改,它会将值2赋给整数t。这是因为2是ia中的第三个元素,ia[2]引用ia中的第三个元素

t = ia[2];
如果您的原始ia声明被

int ia[] = {0,1,15,3,4,5};
那么你将把t赋值为15

以下内容将ia中索引2处的值更改为42:

ip[2] = 42;
现在,ia由{0,1,42,3,4,5}组成

这是因为ia[2]类似于说*(ia+2)。如果将ip分配给ia,则ip指向ia的第一个元素


类似地,ip[2]类似于说*(ip+2)。因此,更改ip[2]将更改ia[2],它们引用相同的内存块。

a[b]
*(a+b)
完全相同。总是。因此,
ia[2]
相当于
*(ia+2)
ip[2]
相当于
*(ip+2)

然而,它比这更微妙,因为
ia
ip
有非常不同的类型
ia
为数组类型;而
ip
是指针类型。所以它们不是“相同的”——它们甚至不是同一类型的东西。就像苹果和桔子

在某些上下文中使用的数组表达式可以隐式转换为指向其第一个元素的指针。如果您编写,
int*ip=ia
,这将是一种隐式转换--
ip
现在指向
ia
的第一个元素。它与您所写的完全相同,
int*ip=&ia[0]


当您编写类似于
*(ia+2)
的内容时,在这种情况下,数组也会隐式转换为指向其第一个元素的指针,类似于
*(&ia[0]+2)
。因为我们知道
ip
指向
ia
的第一个元素,所以当您在任何将其转换为指针的上下文中使用
ia
时,它与使用
ip
的值相同。这就是为什么
ia[2]
ip[2]
的工作原理相同。

a[b]
*(a+b)
完全相同。总是。因此,
ia[2]
相当于
*(ia+2)
ip[2]
相当于
*(ip+2)

然而,它比这更微妙,因为
ia
ip
有非常不同的类型
ia
为数组类型;而
ip
是指针类型。所以它们不是“相同的”——它们甚至不是同一类型的东西。就像苹果和桔子

在某些上下文中使用的数组表达式可以隐式转换为指向其第一个元素的指针。如果您编写,
int*ip=ia,这将是一种隐式转换--
ip