Программирование. Принципы и практика использования C++ Исправленное издание, стр. 247
int strlen(const char a[]) // аналогична стандартной // функции strlen(){ int count = 0; while (a[count]) { ++count; } return count;}char lots [100000];void f(){ int nchar = strlen(lots); // ... Наивно (но частично обоснованно) мы могли бы ожидать, что при выполнении этого вызова будут скопированы 100 тыс. символов, заданных как аргумент функции
strlen()char p[]char* pstrlen(lots)strlen(&lots[0])Обратите внимание на то, что указатель, образованный из имени массива, установлен на его первый элемент и не является переменной, т.е. ему ничего нельзя присвоить.
char ac[10];ac = new char [20]; // ошибка: имени массива ничего присвоить нельзя&ac[0] = new char [20]; // ошибка: значению указателя ничего // присвоить нельзяИ на десерт — проблема, которую компилятор может перехватить!
Вследствие неявного превращения имени массива в указатель мы не можем даже скопировать массивы с помощью оператора присваивания.
int x[100];int y[100];// ...x = y; // ошибкаint z[100] = y; // ошибкаЭто логично, но неудобно. Если необходимо скопировать массив, вы должны написать более сложный код. Рассмотрим пример.
for (int i=0; i<100; ++i) x[i]=y[i]; // копируем 100 чисел типа intmemcpy(x,y,100*sizeof(int)); // копируем 100*sizeof(int) байтcopy(y,y+100, x); // копируем 100 чисел типа intПоскольку в языке C нет векторов, в нем интенсивно используются массивы. Вследствие этого в огромном количестве программ, написанных на языке C++, используются массивы (подробнее об этом — в разделе 27.1.2). В частности, строки в стиле C (массивы символов, завершаемые нулем; эта тема рассматривается в разделе 27.5) распространены очень широко.
Если хотите копировать, то используйте класс, аналогичный классу
vectorvectorvector<int> x(100);vector<int> y(100);// ...x = y; // копируем 100 чисел типа int18.5.3. Инициализация массива
Массивы имеют одно значительное преимущество над векторами и другими контейнерами, определенными пользователями: язык С++ предоставляет поддержку для инициализации массивов. Рассмотрим пример.
char ac[] = "Beorn"; // массив из шести символовПодсчитайте эти символы. Их пять, но
acСтрока, завершающаяся нулем, является обычным явлением в языке С и многих системах. Такие массивы символов, завершающиеся нулем, мы называем строками в стиле языка С (C-style string). Все строковые литералы являются строками в стиле языка C. Рассмотрим пример.
char* pc = "Howdy"; // указатель pc ссылается на массив из шести // символовГрафически это можно изобразить следующим образом.

Переменная типа
char0'0'int strlen(const char* p) // похоже на стандартную функцию strlen(){ int n = 0; while (p[n]) ++n; return n;}На самом деле мы не обязаны определять функцию
strlen()<string.h>strlen()ncharТолько символьные массивы можно инициализировать с помощью литеральных констант, но любой массив можно инициализировать списком значений его элементов соответствующего типа. Рассмотрим пример.
int ai[] = { 1, 2, 3, 4, 5, 6 }; // массив из шести чисел // типа intint ai2[100] = { 0,1,2,3,4,5,6,7,8,9 }; // остальные 90 элементов