-1

我试图了解指向数组的指针是如何工作的。一个代码片段;

#include<stdio.h> 
  
int main() 
{ 
  int arr[3] = { 0 , 8 ,10 };
  int (*ptr)[3] = &arr;
  int i = 0;
  for (i = 0; i < 3 ; i++)
  printf("Address (%p) - value( %d)\n", (*ptr+i) , *(*ptr + i));
  return 0; 
} 

星号*取消引用ptr. 如果i = 1,为什么(*ptr+i) = ith value不是value at ptr + i

4

3 回答 3

1

的类型ptrint (*)[3](指向长度为 3 的数组的指针int)。的类型*ptrint[3](数组长度为 3 int)。在大多数表达式中,类型的操作数int[3]被转换为指向数组第一个元素的int *(指针)。int该表达式通过指针运算(*ptr+i)生成指向i数组第 th 元素的指针。在表达式*(*ptr+i)中,指向i数组第 th 元素的指针被取消引用以产生数组第ith 元素的值,它的类型为int

于 2021-01-04T16:36:21.020 回答
0

这个使用malloc,但概念与分配一维数组的地址相同。

阅读内联评论,以便更好地理解。

#include <stdio.h>
#include <stdlib.h>

#define NCOLS 5
#define NROWS 2

void function( int (*_2D_ptr_Array)[NCOLS] , int nrows, int ncols );

//enable this to see the demo of accessing elements using pointer to an array 
//disabling this will demo how to pass 2-D array and collect using pointer to an array.

//#define _DEMO_MAIN 

int main()
{
    // a is a pointer to an array of 5 ints
    int (*a)[NCOLS];
    int _2D_Array[NROWS][NCOLS] =   {   
                                        { 10, 20, 30, 40, 50},
                                        { 60, 70, 80, 90, 100}
                                    };
    int i,j;
    
    #ifdef _DEMO_MAIN
    printf("Enter 10 elements\n");
    
    a = malloc(sizeof(int)*5*2);
    
    printf("a got address at %p\n", a);
    
    for(i=0;i<2;i++)
        for(j=0;j<5;j++)
            scanf("%d",a[i]+j);

    //printing one dimentional array values
    // *a is equivalent to a[j], when j = 0
    for(j=0;j<5;j++)
        printf("value  %d is at addr %p\n",*(*a+j),(*a+j));
    
    putchar('\n');
    
    //printing multi-dimentional array values
    // adding j to a[i] or *a gives the next element address in a given row.
    for(i=0;i<2;i++)
        for(j=0;j<5;j++)
            printf("value %d is at %p\n",*(a[i]+j), a[i]+j);
    
    #else
        //a most common use of pointer to an array is to collect the 2-d array as an argument in function
        function( _2D_Array, NROWS, NCOLS );
    #endif
    
    return 0;
}

void function( int (*_2D_ptr_Array)[NCOLS], int nrows, int ncols ) {
    for(int r = 0; r < nrows ; r++) {
        for(int c = 0; c < ncols ; c++) 
            printf("%d ", _2D_ptr_Array[r][c]);
        printf("\n");
    }
}

注意:返回检查类似scanfmalloc未有目的地处理的函数

于 2021-01-04T16:49:30.700 回答
0

以下是表达式如何相互关联:

   ptr  ==  &arr  // int (*)[3] == int (*)[3]
  *ptr  ==   arr  // int [3]    == int [3]

除非它是sizeof或一元运算符的操作数&,或者是用于在声明中初始化字符数组的字符串文字,否则“N 元素数组”类型的表达式T将被转换或“衰减”为表达式键入“pointer to T”,表达式的值将是数组第一个元素的地址。因此在下面的表达式中,*ptrarr衰减”从类型“三元素数组int”到“指针int”,它们的值是 的第一个元素的地址arr

 (*ptr + i)  ==  (arr + i) == &arr[i]  // int * == int * == int *
*(*ptr + i)  == *(arr + i) ==  arr[i]  // int   == int   == int 
于 2021-01-04T16:40:49.157 回答