So - let’s step through the loop - and say the first 10 leds are { a,b,c,d,e,f,g,h,i,j } (using letters so that they’re not getting confused with indexes).
When i = 0, you do a memmove, from leds[0] to leds[1] - which should give you (memmove understands how to handle overlapping memory, so that you don’t just get the first value copied X times over):
{ a, a, b, c, d, e, f, g, h, i }
Now, when i = 1, and you do the memmove from leds[1] to leds[2] you will get
{ a, a, a, b, c, d, e, f, g, h }
etc… until you will end up with { a, a, a, a, a, a, a, a, a, a }
Now, there’s a couple problems with your code as written. First of all, your memmove, because you’re starting at leds[i] is going to overwrite memory and cause a buffer overflow as soon as you get to NUM_LEDS-10.
If what you want to do is move all the leds right 1 and have things walk off the edge of the leds, then all you need for moveRight is:
for(int i = 0; i < NUM_LEDS; i++) {
memmove( &leds[1]], &leds[0], (NUM_LEDS-1) * sizeof(CRGB));
FastLED.show();
delay(30);
}
This will move all the leds every frame. Of course, it means that the value in leds[0] will eventually be the value in every led. Now - if what you want to do is you want them to rotate , that is, as colors move right off the end of the array of leds, then you need to save/restore:
for(int i = 0; i < NUM_LEDS; i++) {
CRGB last_led = leds[NUM_LEDS-1];
memmove(&leds[1], &leds[0], (NUM_LEDS-1)*(sizeof(CRGB));
leds[0] = last_led;
FastLED.show();
delay(30);
}