No, RAM is logically divided into words, which on 32bit arcitectures, are 32bits
The reason for this is that RAM is used to store program data AND the program itself. The program is composed of machine code instructions which are executed by the CPU, and these instructions are 32bits wide... to facilitate this, all data transport and storage systems are 32bits wide. In addition, the registers in the CPU are 32bits wide, so when you do a LOAD or STORE operation, the entire register is copied to RAM... so it makes sence to use 32bit partitions. There are no 8 or 16 bit registers.
You are correct that each address in RAM refers to 1byte... that is that each address is 1byte apart, BUT you will note that whenever you use the address, it is a multiple of 4 (1byte * 4 = 32bits). I believe that if you try to use an address that is not a multiple of 4, you will get some kind of error... I can't remember what it is called at the moment.
If you read some of the assembly code in your design book you will see these concepts in practice. Take a close look at the JUMP operations in relation to the Program Counter (PC), and also the LOAD LOW and LOAD HIGH operations... as these demonstrate limitations of a 32bit command word with 32bit registers.
If I create an array of chars (1 byte each), the address of each element will be 1 higher than the one before it. Are these addresses not the same addresses that the book is referring to, since they are 1 byte apart, but according to word size, they should be 4 bytes apart?
That is an entierly different can of worms. It depends on how your compiler and OS handle arrays and memory alocation. Arrays do not exist in assembly language; physical processors are only designed to run machine code.
When you load one of your chars into a register... it will take up all of the register's 32bits, and when you store it, it is easiest for the compiler to just take up 32bits in RAM. Imagine trying to do it with 4chars stored in each word. When you did a STORE, it would have to load all 4 bytes into one register, calculate the segment that it is replacing, mask it with an AND, shift the value of the char that it wants to write to the correct location, merge it with an OR, then write it. That is at lease 6 extra operations... assuming that it only takes one to make the mask.
In Java, an array of BYTES (8bits) takes up the same amount of space as an array of INTS (32bits).