我对C语言中的数组和指针有很多困惑;为了说明这一点,这是我对一些代码的解释。
int main(void){
int x[10]; //allocates memory for the array x with dimension 10 in the main function
for(int i=0;i<10;i++){
x[i] = i; //for each index of x write the corresponding i number
}
readArray(x, 10); //calls the function readArray(), with 2 arguments,
//the array x and its size, the constant 10
}
现在令人困惑的部分是在readArray()函数中,该函数应该在主函数之前定义。
int readArray(int *y, int size){ //creates the function readArray() with
//a pointer y to the array x (with the address of the
//first element of x and its size
for(int i=0;i<size;i++){
//here is the problem, I want to change the values
//of the array x, but y is a pointer to x, therefore, to me, it should be as
*y[i] = i; //an * is used to access the array x and change its value
//the correct code, however is
y[i] = i // this is supposed to also change the value of x,
// but I thought to change the value we needed to use * as
// y is a pointer to x, therefore changing the values of x (because y is local to readArray())
}
}
我知道*用于指针,但是数组也是指针,所以为什么不使用它呢? 请更正我在注释中写的内容,并说明何时和何处应使用*更改另一个指针所指向的值。
答案 0 :(得分:1)
readArray(x, 10); //calls the function readArray(), with 2 arguments,
//the array x and its size, the constant 10
这实际上没有传递数组x
。如果将数组用于表达式而不是sizeof
或一元&
或用于初始化数组的字符串文字,则表达式将自动转换为指向其第一个参数的指针。因此,这会将指针传递到x[0]
,而不是x
。
int readArray(int *y, int size){ //creates the function readArray() with
//a pointer y to the array x (with the address of the
//first element of x and its size
注释的第二部分是正确的,y
收到x
的第一元素的地址。您应该避免将其视为第一部分,即指向数组的指针。参数int *y
是指向int
的指针,而不是指向数组的指针。即使数组及其第一个元素的地址可能具有相同的值(因为它们从同一位置开始),但指向它们的指针却具有不同的类型且行为不同。
*y[i] = i; //an * is used to access the array x and change its value
下标运算符[ ]
的优先级高于*
。因此*y[i]
等效于*(y[i])
。在y[i]
中,索引i
用于标识超出i
所指位置的y
个元素。然后y[i]
指定该元素。根据定义,y[i]
等效于(*(y+i))
– C实现采用指针y
,向其添加i
,然后应用*
来引用该指针。元素位于结果地址。
然后将*
应用于y[i]
时,由于*
是int
,因此您尝试将y[i]
应用于int
在计算出的位置。这样会产生一条错误消息。
y[i] = i // this is supposed to also change the value of x,
// but I thought to change the value we needed to use * as
// y is a pointer to x, therefore changing the values of x (because y is local to readArray())
下标运算符[ ]
具有内置的*
运算符。所以y[i]
是*(y+i)
。
当对数组使用下标运算符时,如x[i]
,数组x
将自动转换为指向其第一个元素的指针。因此x[i]
实际上是(&x[0])[i]
。并且,根据下标运算符的定义,实际上是*(&x[0] + i)
。因此,当您使用x[i]
时,C实现会获取x
的第一个元素的地址,并向其中添加i
(以元素为单位,而不是以字节为单位),然后引用到那个地址。
由于这种将数组自动转换为指针以及下标运算符的定义,因此可以同时使用x[i]
(其中x
是一个数组)和y[i]
(其中{{ 1}}是一个指针)以引用元素编号y
。
答案 1 :(得分:-1)
函数readArray获得类型为int *(y)的变量。 当您执行y [i]时,您可以“取消” *,然后可以更改y [i]中的值。实际上y [i]就像*(y + i)。 当您执行* y [i]时,您尝试在y [i]中的元素上使用*,然后该程序使您成为错误。 告诉我您是否了解:)
Ps:写readArray(int * y,int size)—>这样,您可以定义一个函数(具有每个变量的类型)