Pointer to 2d Array

This is a discussion on Pointer to 2d Array within the C Programming forums, part of the General Programming Boards category; Code: #include <stdio.h> int main() { int dat[20][20] = { {8, 2, 22, 97, 38, 15, 0, 40, 0, 75, ...

  1. #1
    Registered User
    Join Date
    Aug 2011
    Posts
    24

    Pointer to 2d Array

    Code:
    #include <stdio.h>
    
    int main()
    {
    
    	int dat[20][20] = {
    		{8, 2, 22, 97, 38, 15, 0, 40, 0, 75, 4, 5 ,7 ,78 ,52 ,12 ,50 ,77 ,91 ,8},
    		{49 ,49 ,99 ,40 ,17 ,81 ,18 ,57 ,60 ,87 ,17 ,40 ,98 ,43 ,69 ,48 ,4 ,56 ,62 ,0},
    		{81 ,49 ,31 ,73 ,55 ,79 ,14 ,29 ,93 ,71 ,40 ,67 ,53 ,88 ,30 ,3 ,49 ,13 ,36 ,65},
    		{52 ,70 ,95 ,23 ,4 ,60 ,11 ,42 ,69 ,24 ,68 ,56 ,1 ,32 ,56 ,71 ,37 ,2 ,36 ,91},
    		{22 ,31 ,16 ,71 ,51 ,67 ,63 ,89 ,41 ,92 ,36 ,54 ,22 ,40 ,40 ,28 ,66 ,33 ,13 ,80},
    		{24 ,47 ,32 ,60 ,99 ,3 ,45 ,2 ,44 ,75 ,33 ,53 ,78 ,36 ,84 ,20 ,35 ,17 ,12 ,50},
    		{32 ,98 ,81 ,28 ,64 ,23 ,67 ,10 ,26 ,38 ,40 ,67 ,59 ,54 ,70 ,66 ,18 ,38 ,64 ,70},
    		{67 ,26 ,20 ,68 ,2 ,62 ,12 ,20 ,95 ,63 ,94 ,39 ,63 ,8 ,40 ,91 ,66 ,49 ,94 ,21},
    		{24 ,55 ,58 ,5 ,66 ,73 ,99 ,26 ,97 ,17 ,78 ,78 ,96 ,83 ,14 ,88 ,34 ,89 ,63 ,72},
    		{21 ,36 ,23 ,9 ,75 ,0 ,76 ,44 ,20 ,45 ,35 ,14 ,0 ,61 ,33 ,97 ,34 ,31 ,33 ,95},
    		{78 ,17 ,53 ,28 ,22 ,75 ,31 ,67 ,15 ,94 ,3 ,80 ,4 ,62 ,16 ,14 ,9 ,53 ,56 ,92},
    		{16 ,39 ,5 ,42 ,96 ,35 ,31 ,47 ,55 ,58 ,88 ,24 ,0 ,17 ,54 ,24 ,36 ,29 ,85 ,57},
    		{86 ,56 ,0 ,48 ,35 ,71 ,89 ,7 ,5 ,44 ,44 ,37 ,44 ,60 ,21 ,58 ,51 ,54 ,17 ,58},
    		{19 ,80 ,81 ,68 ,5 ,94 ,47 ,69 ,28 ,73 ,92 ,13 ,86 ,52 ,17 ,77 ,4 ,89 ,55 ,40},
    		{4 ,52 ,8 ,83 ,97 ,35 ,99 ,16 ,7 ,97 ,57 ,32 ,16 ,26 ,26 ,79 ,33 ,27 ,98 ,66},
    		{88 ,36 ,68 ,87 ,57 ,62 ,20 ,72 ,3 ,46 ,33 ,67 ,46 ,55 ,12 ,32 ,63 ,93 ,53 ,69},
    		{4 ,42 ,16 ,73 ,38 ,25 ,39 ,11 ,24 ,94 ,72 ,18 ,8 ,46 ,29 ,32 ,40 ,62 ,76 ,36},
    		{20 ,69 ,36 ,41 ,72 ,30 ,23 ,88 ,34 ,62 ,99 ,69 ,82 ,67 ,59 ,85 ,74 ,4 ,36 ,16},
    		{20 ,73 ,35 ,29 ,78 ,31 ,90 ,1 ,74 ,31 ,49 ,71 ,48 ,86 ,81 ,16 ,23 ,57 ,5 ,54},
    		{1 ,70 ,54 ,71 ,83 ,51 ,54 ,69 ,16 ,92 ,33 ,48 ,61 ,43 ,52 ,1 ,89 ,19 ,67 ,48},
    	};
    
    	int (*matrix_ptr)[20] = dat;
    
    	return 0;
    }
    When declaring a pointer to a two dimensional array, why must I include the subscript? And when I dereference the pointer twice (**matrix_ptr) I get the first element of the first array; that is dat[0][0], or 8. What am I getting when I dereference the pointer only once (*matrix_ptr)?

  2. #2
    Registered User
    Join Date
    Sep 2006
    Posts
    8,868
    Quote Originally Posted by deadrabbit View Post
    When declaring a pointer to a two dimensional array, why must I include the subscript? And when I dereference the pointer twice (**matrix_ptr) I get the first element of the first array; that is dat[0][0], or 8. What am I getting when I dereference the pointer only once (*matrix_ptr)?
    So the program knows what to initialize the row pointers, to. They have to point to the address of the first row's element, and you can't do that, if you don't know how many columns are in a row.

    When you dereference **matrix, you get the address of the matrix array (the whole thing pointer if you will). When you dereference *matrix, you get the address of the first row's, first element. As you see, they both happen to be the same address - but they're not the same things.

  3. #3
    Registered User
    Join Date
    Oct 2008
    Location
    TX
    Posts
    2,047
    Quote Originally Posted by deadrabbit View Post
    When declaring a pointer to a two dimensional array, why must I include the subscript? And when I dereference the pointer twice (**matrix_ptr) I get the first element of the first array; that is dat[0][0], or 8. What am I getting when I dereference the pointer only once (*matrix_ptr)?
    Perhaps, writing it out symbolically may help:
    Code:
        matrix == dat;         /*   dat same as &dat[0]                  */
        *matrix == dat[0];     /*   dat[0] same as &dat[0][0]            */
        **matrix == dat[0][0]  /*   and, *&dat[0][0] same as dat[0][0]   */

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Replies: 16
    Last Post: 01-28-2010, 01:44 AM
  2. Casting from a 1D array pointer to a scalar pointer
    By komkamol in forum C Programming
    Replies: 8
    Last Post: 09-25-2009, 01:44 AM
  3. pointer to pointer that points to a char array
    By steve1_rm in forum C Programming
    Replies: 2
    Last Post: 01-13-2009, 11:03 PM
  4. Replies: 1
    Last Post: 03-24-2008, 10:16 AM
  5. A pointer to a character pointer array... can't pass
    By Lynux-Penguin in forum C Programming
    Replies: 9
    Last Post: 10-12-2003, 10:53 PM

Tags for this Thread


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21