Нет, эти две строки не дают одинакового результата.
char s[] = "string"
приводит к изменяемому массиву из 7 байтов, который изначально заполняется содержимым 's' 't' 'r' 'i' 'n' 'g' '\0'
(все копируются во время выполнения из строкового литерала).
char *s = "string"
приводит к указателю на некоторую только для чтения память, содержащую строковый литерал "string".
Если вы хотите изменить содержимое вашей строки, то первый способ - единственный. Если вам нужен только доступ только для чтения к строке, то вторая будет немного быстрее, потому что строку не нужно копировать.
В обоих случаях нет необходимости указывать нулевой терминатор в строковом литерале. Об этом позаботится компилятор, когда встретится с закрытием ".