0

I'm learning C, and C is my first programming language. I'll add code first.

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

int main() {
    int row = 3, col = 2;

    int(*ptr)[2] = (int(*)[2])malloc(sizeof(int) * row * col);
    if (!ptr) exit(1);
    printf("%d", sizeof(*ptr[0]));
    return 0;
}

4

Maybe, ptr[0] is pointer or array. Should I think ptr[0] as an array?

1
  • 1
    In C, int(*ptr)[2] = (int(*)[2])malloc(sizeof(int) * row * col); better as int(*ptr)[2] = malloc(sizeof *ptr * row); and printf("%d", sizeof(*ptr[0])); as printf("%zu", sizeof *ptr[0]);. Commented Jan 1, 2022 at 19:35

1 Answer 1

5

int (*ptr)[2] declares ptr to be a pointer to an array of two int.

That means *ptr is an array of two int. ptr[0] is effectively the same as *ptr, so it is also an array of two int.

By definition, ptr[0] means to add zero to ptr and then apply *. Adding zero does not change the value, so ptr[0] is effectively *ptr.

Setting ptr to (int (*)[2]) malloc(sizeof(int) * row * col); sets it to point to memory that can be used as 3 arrays of 2 int (because row is 3 and col is 2). So those three arrays are ptr[0], ptr[1], and ptr[2].

Since each of those is an array of two int, they each have two elements, which can be accessed as ptr[0][0], ptr[0][1], ptr[1][0], ptr[1][1], ptr[2][0], and ptr[2][1].

Note that the subscript operator, [ … ], can be used with pointers or arrays. In either case, E1[E2] is defined to be *((E1) + (E2)). With a pointer, this addition operates in units of the pointed-to type. When E1 is a pointer to an array of two int, adding 1 or 2 produces a pointer that points 1 or 2 arrays of two int further along in memory (as long as the arithmetic remains in bounds of the applicable space). When E1 is an array, it is automatically converted to a pointer to its first element, and then the arithmetic proceeds as for a pointer.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.