/******************************************************************************
Online C Compiler.
Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
int ** generate2DBuffer(int dim1, int dim2)
{
int **ptr;
ptr = malloc(dim1* sizeof(int*));
if (ptr != 0)
{
for (int i = 0; i < dim1; i++)
{
ptr[i] = malloc(dim2* sizeof(int));
}
}
int counter = 0;
if (ptr != 0)
{
for (int i = 0; i < dim1; i++)
{
for (int d = 0; d < dim2; d++)
{
ptr[i][d] = counter;
counter++;
}
}
}
return ptr;
}
void free2DBuffer(int **ptr, int dim1)
{
for (int i = 0; i < dim1; i++)
{
int *subarray = ptr[i];
free(subarray);
}
free(ptr);
}
int * generateArray(int dim1, int dim2)
{
int *ptr = malloc(sizeof(int[dim1][dim2]));
if (ptr != 0)
{
for (int i = 0; i < (dim1 *dim2); i++)
{
ptr[i] = i;
}
}
return ptr;
}
int main()
{
int ary[2][3] = {
{ 1, 2, 3 },
{ 4, 5, 6 }
};
int *p1 = ary[0]; //Pointer zum ersten Subarray
int *p2 = ary[1]; //Pointer zum zweiten Subarray
int(*p3)[3] = ary; //Pointer auf Subarrays der länge 3
int *p4 = &ary[0][0]; //geht auch nutzt aber aus, dass solche Arrays immer ein zusammenhängender Speicherbereich sind
for (int i = 0; i < 3; i++)
{
printf("%d", p1[i]);
}
printf("\n");
for (int i = 0; i < 3; i++)
{
printf("%d", p2[i]);
}
printf("\n");
for (int i = 0; i < 2; i++)
{
for (int d = 0; d < 3; d++)
{
printf("%d", p3[i][d]);
}
}
printf("\n");
for (int i = 0; i < 2; i++)
{
for (int d = 0; d < 3; d++)
{
printf("%d", ary[i][d]);
}
}
printf("\n");
for (int i = 0; i < (2 *3); i++)
{
printf("%d", p4[i]);
}
printf("\n");
int **p5 = generate2DBuffer(2, 4);
if (p5 != 0)
{
for (int i = 0; i < 2; i++)
{
for (int d = 0; d < 4; d++)
{
printf("%d", p5[i][d]); //2D Notation eines double pointers
}
}
printf("\n");
int *p6 = &p5[0][0];
for (int i = 0; i < (2 *4); i++)
{
printf("%d", p6[i]); //Ist nicht ident zu einem 2D Array
}
free2DBuffer(p5, 2);
}
printf("\n");
int * intptr = generateArray(2,4);
if(intptr != 0)
{
int (*p7)[4] = (int (*)[4])intptr; //Casting too supress compiler warning
for (int i = 0; i < 2; i++)
{
for (int d = 0; d < 4; d++)
{
printf("%d", p7[i][d]); //p7 ist ein "echtes" 2D array
}
}
printf("\n");
int *p8 = &p7[0][0];
for (int i = 0; i < (2 *4); i++)
{
printf("%d", p8[i]); //Daher liefert diese Zeile auch das richtige ergebnis
}
free(intptr);
}
printf("\n");
printf("End");
}