The declaration char buffer[9] = "12345678"; creates an array of 9 chars.
Here, buffer is the address of its first element but not of the array.
char* pBuffer = buffer; is a correct expression as pBuffer is a pointer to char and can address the first element.
But the expression char* pBuffer = &buffer is wrong, because pBuffer can't address an array. (error in your code, &buffer address of array as explained below)
Difference between buffer and &buffer
&buffer means address of array. The values of buffer and &buffer are really the same, but semantically both are different. One is an address of a char, while the other is an address of an array of 9 chars.
buffer[9] = "12345678";
+----+----+----+---+---+----+----+----+---+----+
| '1'| '2' |'3'|'4'|'5'| '6'| '7'|'8' | 0 | ...........
+----+----+----+---+---+----+----+----+---+---+----+
201 202 203 204 205 206 207 208 209 210 211
^ ^
| |
(buffer) (buffer + 1)
| |
|-----------------------------------------|--------
|201 | 210
^ ^
| |
(&buffer) (&buffer + 1)
I used decimal numbers for address instead of hexadecimal
Even though the value of buffer is 201 and the value of &buffer is 201, their meaning is different:
buffer: first element's address—its type is char*.
&buffer: complete char array's address—its type is char(*)[9].
Additionally, to observe the difference, add 1 :
buffer + 1 gives 202 that is the address of the second array element '2' but
&buffer + 1 gives 210 which is the address of the next array.
On My System, I write following code:
int main(){
char buffer[9] = "12345678";
char (*pBuffer)[9] = &buffer;
printf("\n %p, %p\n",buffer, buffer+1);
printf("\n %p, %p\n",(&buffer), (&buffer+1));
}
And the output is as below:
0xbfdc0343, 0xbfdc0344
0xbfdc0343, 0xbfdc034c
[ANSWER]
That's the reason Error is:
error: cannot convert 'char ()[9]' to 'char' in initialization
You are trying to assign 'char (*)[9]' type value to char*.
char (*ptr2)[9]; Here ptr2 is pointer to an array of 9 chars, And this time
ptr2=&buffer is a valid expression.
How to correct your code?
As in Nate Chandler's answer:
char buffer[9] = "12345678";
char* pBuffer = buffer;
or another approach,
char buffer[9] = "12345678";
char (*pBuffer)[9] = &buffer;
Which you choose depends on what you need.