*如何访问变量或数组的指针?

时间:2019-11-13 10:59:04

标签: c arrays pointers

我对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())
 }
}

我知道*用于指针,但是数组也是指针,所以为什么不使用它呢? 请更正我在注释中写的内容,并说明何时和何处应使用*更改另一个指针所指向的值。

2 个答案:

答案 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)—>这样,您可以定义一个函数(具有每个变量的类型)