There are two arrays:
char *strchar* str[]
By its principle, this is just a one-dimensional array, but at the same time, I cannot add any values โโto the second. Question: what is the difference between them then? Why declare them exactly in this form and what is a plus for it?

const char* strs[] = {"Hello", "world"};- ฿฿฿ค฿const char * strs[], that is, not a constant array of pointers to constant strings. - ฿฿฿ค฿"...") has the typeconst char[...], that is, a constant array. This is where you got the initial error due to the attempt to assign a constant to where it is permissible to change values. - ฿฿฿ค฿const char * const str[]- the pointer asterisk divides the ad into two parts. The left one refers to the specified type, and the right one to the indicating type (that is, directly to the pointer). By the way, thanks to this, theconst char * fooandchar const * fooexpressions are completely similar. And another point: the spaces around the asterisks do not matter, they are purely for readability. - ฿฿฿ค฿