GBinow
GBinow

Reputation: 13

How to use pointer to bidimensional array C

How do I edit a value in an array with pointer in C?

int *pointer;
int array[3][1];

I tried this:

int *Pointer
int array[2][2];
Pointer[1][1]= 6;

but when compiling, I get a segmentation fault error. What to do?

Upvotes: 0

Views: 236

Answers (5)

1.

You never assigned a value to Pointer in your example. Thus, attempting to access array by Pointer invokes undefined behavior.

You need to assign Pointer by the address of the first element of array if the pointer shall be a reference:

Pointer = *array;

2.

You can't use 2D notation (p[1][1]) for a pointer to int. This is a C syntax violation.


3.

Since rows of static 2D arrays are allocated subsequent in memory, you also can count the number of array elements until the specific element of desire. You need to subtract the count by 1 since indexing start at 0, not 1.

How does it work?

Each row of array contains 2 elements. a[1][1] (the first element of the second row) is directly stored after the first two.

Note: This is not the best approach. But worth a note beside all other answers as possible solution.

#include <stdio.h>

int main (void)
{   
   int *Pointer;
   static int array[2][2];

   Pointer = *array;

   Pointer[2] = 6;

   printf("array[1][1] (by pointer) = %d\n", Pointer[3]);
   printf("array[1][1] (by array istelf) = %d\n", array[1][1]);
}

Output:

array[2][2] (by pointer) = 6
array[2][2] (by array istelf) = 6

Side Notes:

  • To address the first element of the second row by array[1][2] invokes undefined behavior. You should not use this way.

  • "but when compiling, I get a segmentation fault error."

Segmentation fault error do not occur at compile time. They occur at run time. It just gives you the impression because high probably your implementation immediately executes the program after compilation.

Upvotes: 0

Willem Vermin
Willem Vermin

Reputation: 56

Using the function wv_matalloc from https://www.ratrabbit.nl/ratrabbit/content/sw/matalloc/introduction , you can write the following code:

#include <stdio.h>
#include "wv_matalloc.h"
int main()
{
   double **matrix;
   int m = 3;
   int n = 4;
   // allocate m*n matrix:
   matrix = wv_matalloc(sizeof(double),0,2,m,n);

   // example of usage:
   int i,j;
   for (i=0; i<m; i++)
      for (j=0; j<n; j++)
        matrix[i][j] = i*j;
   printf("2 3: %f\n",matrix[2][3]);
}

Compile with:

cc -o main main.c wv_matalloc.c

Upvotes: 0

Appaji Chintimi
Appaji Chintimi

Reputation: 675

Cast the 2D-array into 1D-array to pass it to a pointer, And then, You are ready to access array with pointer. You can use this method to pass 2D-array to a function too.

#include <stdio.h>

int main()
{
    int arr[2][2];
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            arr[i][j] = (2 * i) + j;
        }
    }
    int *Pointer = (int *)arr; // Type conversion
    /*
    &arr[0][0] = Pointer + 0
    &arr[0][1] = Pointer + 1
    &arr[1][2] = Pointer + 2
    &arr[2][2] = Pointer + 3

    Dereference Pointer to access variable behind the address
    *(Pointer + 0) = arr[0][0]
    *(Pointer + 1) = arr[0][1]
    *(Pointer + 2) = arr[1][2]
    *(Pointer + 3) = arr[2][2]

    */
    for (int i = 0; i < 2; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            printf("%d ", *(Pointer + (2 * i) + j)); // Accessing array with pointer
        }
        printf("\n");
    }
    return 0;
}

Upvotes: 1

paulsm4
paulsm4

Reputation: 121759

You can access any given element with this syntax: array[x][y].

By the same token, you can assign your pointer to any element with this syntax: p = &array[x][y].


In C, you can often treat arrays and pointers as "equivalent". Here is a good explanation:

https://eli.thegreenplace.net/2009/10/21/are-pointers-and-arrays-equivalent-in-c

However, you cannot treat a simple pointer as a 2-d array. Here's a code example:

/*
 * Sample output:
 *
 * array=0x7ffc463d0860
 * 1 2 3
 * 4 5 6
 * 7 8 9
 * p=0x7ffc463d0860
 * 0x7ffc463d0864:1 0x7ffc463d0868:2 0x7ffc463d086c:3
 * 0x7ffc463d0870:4 0x7ffc463d0874:5 0x7ffc463d0878:6
 * 0x7ffc463d087c:7 0x7ffc463d0880:8 0x7ffc463d0884:9
 */
#include <stdio.h>

int main()
{
  int i, j, *p;
  int array[3][3] = {
    {1,2,3},
    {4,5,6},
    {7,8,9}
  };

  // Dereference 2-D array using indexes
  printf("array=%p\n", array);
  for (i=0; i < 3; i++) {
    for (j=0; j < 3; j++)
      printf ("%d ", array[i][j]);
    printf ("\n");
  }

  // Dereference 2-D array using pointer
  p = &array[0][0];
  printf("p=%p\n", p);
  for (i=0; i < 3; i++) {
    for (j=0; j < 3; j++)
      printf ("%p:%d ", p, *p++);
    printf ("\n");
  }

  /* Compile error: subscripted value p[0][0] is neither array nor pointer nor vector
      p = &array[0][0];
      printf("p=%p, p[0]=%p, p[0][0]=%p\n", p, &p[0], &p[0][0]);
   */

  return 0;
}

Upvotes: 1

Eric Postpischil
Eric Postpischil

Reputation: 223274

Given some array int Array[Rows][Columns], to make a pointer to a specific element Array[r][c] in it, define int *Pointer = &Array[r][c];.

Then you may access that element using *Pointer in an expression, including assigning to *Pointer to assign values to that element. You may also refer to the element as Pointer[0], and you may refer to other elements in the same row as Pointer[y], where y is such that 0 ≤ y+c < Columns, i.e., Pointer[y] remains in the same row of the array.

You may also use Pointer[y] to refer to elements of the array in other rows as long as none of the language lawyers see you doing it. (In other words, this behavior is technically not defined by the C standard, but many compilers allow it.) E.g., after Pointer = &Array[r][c];, Pointer[2*Columns+3] will refer to the element Array[r+2][c+3].

To make a pointer you can use to access elements of the array using two dimensions, define int (*Pointer)[Columns] = &Array[r];.

Then Pointer[x][y] will refer to element Array[r+x][y]. In particularly, after int (*Pointer)[Columns] = &Array[0]; or int (*Pointer)[Columns] = Array;, Pointer[x][y] and Array[x][y] will refer to the same element.

Upvotes: 1

Related Questions