It looks like plantValue in your code is a pointer to an array of pointers to raw C-style strings, i.e.:
+----------+ plantValue --> | char * | --> String #1 (char **) +----------+ | char * | --> String #2 +----------+ | ... | +----------+ | char * | --> String #N +----------+
So, that code is basically allocating a new C-style string using malloc(), and storing a pointer to it in a slot in the char* vector represented above.
In particular, plantCount-1 is the index of the first available slot in the pre-allocated pointer array; plantValue + (plantCount-1) points to that slot, and with *(plantValue + (plantCount-1)) = ... you write the string pointer returned by malloc() in that slot.
Please note that the above code is more C than C++; for example, in C++ you would use new[] instead of malloc() for explicit dynamic memory allocations; but, even better, in C++ you should use standard container classes likes std::vector, and std::string instead of raw char* owning pointers. These C++ classes automatically manage their own memory, and simplify your code a lot.
P.S. Note also that C-style strings are NUL-terminated, so when you allocate memory for a new string with malloc(), you should consider also the terminating NUL when you compute the total length (in other words, you should have SAPPlantStr.length() + 1 in your code).
pand indexi, the expression*(p + i)is equal top[i]. In your specific case it means that*(plantValue + (plantCount-1))is equal toplantValue[plantCount-1]. Hopefully that should make it clearer for you.std::stringfor strings, andstd::vectorfor a dynamic "array".'\0'character.