Contact type array returning address value

Below is the contract which imports another contract

pragma solidity ^0.8.7;

import "./SimpleStorage.sol"; 

contract StorageFactory {

   SimpleStorage[] public simpleStorageArray;    
   function createSimpleStorageContract() public {
       SimpleStorage simpleStorage = new SimpleStorage();

Now after using function createSimpleStorageContract() and trying to fetch elements of array , we are seeing

SimpleStorage is another contract which I wrote and then imported it. Now simpleStorageArray is an array of type SimpleStorage. However what I am not able to understand which I try to fetch any value by providing index number in remix , it returns me the address. In every element it should store a new instance of contract why is it storing addresses. Can anyone please explain if array is of SimpleStorage contract type then why it stores & returns address when given index number ?

it will not store a contract in binary data, it will store only the address of the contract, and it will know its interface in order to know what functions to call on that contract address that is saved in that array

Why & how will it store address of contract. It is an array of type SimpleStorage , so how it can store address data type. It should store only one unique copy of contract in there at that index. Can you please once explain ?

what do you expect with one unique copy of the contract?

the new contract is deployed on the blockchain, not saved in current contract, only a reference to the deployed contract is saved, and that reference is the contract address

But in other array like uint256 array that particular value is stored. It is not like uint value will be stored at an address and that address will be stored in uint array. So why this different behaiour in case of contract ?

this is how solidity works in this case, you deploy a contract and it saves only the address of the contract.
for example you can use the same way a contract that you never knew about it before, by using only its address and its interface and call its methods after that, for example if you want to interact with nft contracts from a new contract, you could call a function in an nft contract and that nft contract was not deployed by current contract and all you know about the nft contract is its address and its interface

So means like we can assue that is is the innate basic functioning in solidity that that in case of contract type array it stores the address of deployed contract , is it so ?

we could assume that, it looks like contracts are treated differently compared to an uint256