data structures using in this casearr has type int *since all pointers have the same sizethe address of ptr can be calculated asaddr(ptr iaddr(ptr[sizeof(int *iaddr(ptr[ isince arr has type int **arr[ &arr[ ][ ]arr[ &arr[ ][ ]and in generalarr[ &arr[ ][ according to pointer arithmeticarr arr[ ]yet this skips an entire row of elementsi it skips complete bytes ( elements each of bytes sizethereforeif arr is address then arr is address to summarize&arr[ ][ ]arr[ ]arrand &arr[ point to the base address &arr[ ][ points to arr[ ][ arr[ points to arr[ ][ arr points to arr[ ][ &arr[ points to arr[ ][ to concludea two-dimensional array is not the same as an array of pointers to arrays actually two-dimensional array is declared asint (*ptr)[ here ptr is pointer to an array of elements the parentheses are not optional in the absence of these parenthesesptr becomes an array of pointersnot pointer to an array of ints look at the code given below which illustrates the use of pointer to two-dimensional array #include int main(int arr[ ][ ]={{ , }{ , }}int (*parr)[ ]parr arrfor( ++for( ; ++printf(% "(*(parr+ ))[ ])return output the golden rule to access an element of two-dimensional array can be given as arr[ ][ (*(arr+ ))[ *((*arr+ ))+ *(arr[ ]+jthereforearr[ ][ *(arr)[ *((*arr)+ *(arr[ ]+ arr[ ][ (*(arr+ ))[ *((*(arr+ ))+ *(arr[ ]+ if we declare an array of pointers usingif we declare pointer to an array usingdata_type *array_name[size]data_type (*array_name)[size]here size represents the number of rows and the space for columns that can be dynamically allocated here represents the number of columns and the space for rows that may be dynamically allocated (refer appendix to see how memory is dynamically allocated