Dynamic Range and Image Contrast
I would say, in general, that Dynamic Range is a property of the measuring device while contrast is a property of the signal measures assuming it is withing the Dynamic Range of the measuring device.

Let's have an example.
Imagine our dynamic range is measures as 8 bits system (We can derive that from having a sensor with ~48 [dB] DR).
So we have values in the range $ [0, 255] $.  

Let's assume we measured 2 different scenes, one spans values in the range $ [4, 232] $ while the other in the range $ [120, 130] $.

So we have a sensor with Dynamic Range of 48 [dB] and the 1st image has high contrast (Big ratio between the high value and the low) while the 2nd image has low contrast.

For instance, the following code in MATLAB:

mA = repmat(linspace(4, 232, 200) / 255, [200, 1]);
mB = repmat(linspace(120, 130, 200) / 255, [200, 1]);

subplot(1, 2, 1); imshow(mA); title('High Contrast'); subplot(1, 2, 2); imshow(mB); title('Low Contrast');


Yielded this result:



Answering Comments


  the upper limit is determined by saturation and the lower limit by noise"


One nice abstraction to Pixel in CCD / CMOS is a bucket.
The light is like rain and the output value - Amount of rain in the bucket.
So when the bucket is full, saturated, we define it as white. Let's say the bucket can hold 256 drops. So if the bucket is full it means at least 256 drops fell into it )Some might spill over).
The minimum number of Drops which we can measure is 1 drop. So we have 256 / 1 DR -> 8 Bit of DR.


  When an appreciable number of pixels in an image have a high dynamic range, we can expect the image to have high contrast. Conversely, an image with low dynamic range typically has a dull, washed-out gray look


Just as can be seen in the figure from MATLAB, when we have saturates buckets, which are white ans we have almost dry buckets (Black) we have high contrast.
Yet if all buckets are filled with similar amount of rain the image indeed looks dull as can be seen.