cpointersstructmember-access

What is the use of i in `printf("%d\n",(a->ptr)[i]);`?


Hey guys I am currently learning DSA and in ADT I have a problem: This is a code that creates a custom array and takes the input of the array and stores it and prints it too but I want to ask that what does that [i] do in printf("%d\n",(a->ptr)[i]); that thing is what I am not getting in this code

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

struct myArray{
    int total_size;
    int used_size;
    int *ptr;
};

void createArray(struct myArray * a,int tSize,int uSize)
{
    a->total_size = tSize;
    a->used_size = uSize;
    a->ptr = (int *) malloc(tSize * sizeof(int));
}

void show(struct myArray * a){
    for(int i=0; i < a->used_size; i++){
        printf("%d\n",(a->ptr)[i]);
    }
}

void setVal(struct myArray * a){
    int n;
    for(int i=0; i < a->used_size; i++){
        printf("Enter Element %d: ", i);
        scanf("%d",&n);
        (a->ptr)[i] = n;
    }
}

int main(){
    struct myArray marks;
    createArray(&marks,10,2);
    printf("We are running setVal now\n");
    setVal(&marks);

    printf("We are running show now\n");
    show(&marks);
    return 0;
}

Solution

  • The data member ptr points to a dynamically allocated array

    a->ptr = (int *) malloc(tSize * sizeof(int));
    

    To access elements of the array you can use the subscript operator

     printf("%d\n",(a->ptr)[i]);
    

    To make it more clear consider the following code snippet.

    enum { N = 10 };
    int *ptr = malloc( N * sizeof( int ) );
    for ( int i = 0; i < N; i++ )
    {
        ptr[i] = i;
    }
    

    The difference with the original code is the pointer ptr is a data member of a structure and to access ptr using a pointer to an object of the structure type you have to change in the code above the expression

    ptr[i]
    

    to

    ( a->ptr )[i]
    

    that is the same as

    a->ptr[i]
    

    because there are used the postfix operator -> and [] that evaluates left to right.