Создание предварительно подписанного URL-адреса является чисто клиентской операцией. Это не связано с затратами AWS и сетевой активностью. Используемый вами SDK берет ваши текущие учетные данные, корзину и ключ для вашего объекта, ваш выбранный метод (например, GET), время истечения, а также рассчитывает и подписывает URL-адрес, все это делается локально.
Если вам нужна разница между ними, просто представьте их как:
non-constant
указатель на non-constant
символ non-constant
указатель на constant
символ constant
указатель на non-constant
символ constant
указатель на constant
символ <час> Ссылка [ссылка]
Наверное, я слишком разборчив. В моей книге символы, на которые указывает const char *, могут быть изменены, но не через const char *. Const char * может указывать на изменяемое хранилище. Пример:
char a[] = "abracadabra";
const char * ccp = &a[0]; // ccp points to modifiable storage.
*&a[0] = 'o'; // This writes to a location pointed to by const char* ccp
Итак, моя формулировка такова:
Символ * - это указатель, который можно изменить и который также позволяет писать через него при разыменовании с помощью * или [].
const char * - это указатель, который можно изменить и который не позволяет писать через него при разыменовании с помощью * или [].
const char *
означает "указатель на немодифицируемый символ". Обычно он используется для строк символов, которые не должны быть изменены.
Допустим, вы пишете эту функцию:
int checkForMatch(const char * pstr)
Вы пообещали (через сигнатуру функции), что не будете изменять то, на что указывает pstr
. Теперь предположим, что часть проверки на совпадение будет включать игнорирование регистра букв, и вы попытаетесь сделать это, преобразовав строку в верхний регистр до выполнения других проверок:
strupr(pstr);
Вы получите ошибку, говорящую, что вы не можете этого сделать, потому что strupr
объявлена как:
char * strupr(char* str);
... и это означает, что она хочет иметь возможность писать в строку. Вы не можете писать в символы в const char *
(для этого и существует const
).
В общем, вы можете передать char *
во что-то, что ожидает const char *
без явного приведения, потому что это безопасно (передать что-то модифицируемое чему-то, что не собирается его модифицировать), но вы не можете передать const char *
во что-то, ожидающее char *
(без явного приведения), потому что это небезопасно (передача чего-то, что не предназначено для модификации, во что-то, что может его модифицировать).
Конечно, это C, и в C можно делать практически все, включая явное приведение const char *
к char *
- но это будет очень, очень плохая идея потому что есть (предположительно) какая-то причина, по которой то, на что указывает указатель, является const
.