3

What are the differences between an array of char pointers and a 2D array?

2

4 Answers 4

4
char* pasz[3] = {"abc", "def", "ghi"};
char asz[3][] = {"abc", "def", "ghi"};

The similarities and differences are basically the same as between these two:

char *psz = "jkl";
char sz[] = "jkl";

The first is originally read-only.

psz[0] = 'a'; // Illegal!!

The second, you can modify, since you allocate it with the [].

sz[0] = 'b';
// sz == "bkl"

The first, you can modify what it points to:

char mysz[] = "abc";
psz = mysz;

psz[0] = 'b';
// mysz == "bbc"

The second, you cannot:

sz = mysz; // Can't assign an array to an array!!
Sign up to request clarification or add additional context in comments.

3 Comments

how did pasz become psz and asz become sz ?
@Failed_Noob By removing one dimension of array []. (char*[] to char*. And char[][] to char[].) It is a lot easier to think of it that way - they're basically the same thing, except in the first code snippet, we have another dimension of complexity. For teaching purposes, I removed this complexity.
char asz[][] = {"abc", "def", "ghi"}; is not valid declaration through, Column index is mandatory here.
2
char* my_string[];

represents an array of strings.

int my_grid_of_ints[][];
char my_block_of_text[][];

If color = byte[3] then you could represent your screen monitor

color my_pixel_buffer[][] = new color[768][1024];

is a 2D array. As you can see, a 2D array can represent anything, including an array of char pointers (such as multiple lines of strings).

7 Comments

After seeing muntoo's answer, I'm unsure if I misunderstood you.
How is int my_ints[]; a 2D array?
Is my syntax wrong? Sorry, I havent used C ever, only C++. Also, it has been some time - I'm used to C#!
A int my_ints[][]; would be 2D. It is the same in C++. (I am a C++ programmer, so my C skills aren't too great either. :))
Just going to nod and pretend I understood that. ;)
|
1

You can access elements with the same syntax, but the guarantees about memory layout is much different. The 2d array is contiguous. The array of pointers is not.

1 Comment

This also means that you can use memcpy() and similar functions of the former, but not on the latter. Also, you can't cast between 2d arrays (array of arrays) and pointer-to-pointers.
0

Array of arrays (aka multi-dimensional array) looks like (in memory):

a[0][0], a[0][1], a[0][n-1], a[1][0], a[1][1], ..., a[1][n-1], ..., a[m-1][n-1]

array of pointers looks like:

p[0], p[1], ..., p[m-1]

where each slot is a pointer and can point to whatever. If they all happen to point to arrays with n elements each, then p[i][j] and a[i][j] can be used similarly in expressions, but they're actually quite different objects.

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.