строка С++
C++ предоставляет два типа строковых представлений:
- Строки в стиле C
- Тип класса string, представленный в C++.
Строки в стиле C
Строки в стиле C возникли на языке C и продолжают поддерживаться в C++. Строки на самом деле представляют собой \0
одномерные массивы символов с нулевым завершением. Таким образом, строка с нулевым завершением содержит символы, составляющие строку.
Следующее объявление и инициализация создают HELLO
строку. HELLO
Размер массива символов на единицу больше количества символов в слове из-за нулевого символа, хранящегося в конце массива .
char site[6] = {
'H', 'E', 'L', 'L', 'O', '\0'};
пример
#include <iostream>
using namespace std;
int main ()
{
char site[6] = {
'H', 'E', 'L', 'L', 'O', '\0'};
cout << "你好: ";
cout << site << endl;
return 0;
}
выход
你好: HELLO
В C++ существует большое количество функций для работы со строками, завершающимися нулем:
пример
#include <iostream>
#include <cstring>
using namespace std;
int main ()
{
char str1[13] = "hello";
char str2[13] = "google";
char str3[13];
int len ;
// 复制 str1 到 str3
strcpy( str3, str1);
cout << "strcpy( str3, str1) : " << str3 << endl;
// 连接 str1 和 str2
strcat( str1, str2);
cout << "strcat( str1, str2): " << str1 << endl;
// 连接后,str1 的总长度
len = strlen(str1);
cout << "strlen(str1) : " << len << endl;
return 0;
}
Приведенный выше код компилируется и выполняется, давая следующий результат:
strcpy( str3, str1) : hello
strcat( str1, str2): hellogoogle
strlen(str1) : 11
Строковый класс в C++
Стандартная библиотека C++ предоставляет строковый тип класса, который поддерживает все вышеперечисленные операции, а также многие другие.
Пример:
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str1 = "runoob";
string str2 = "google";
string str3;
int len ;
// 复制 str1 到 str3
str3 = str1;
cout << "str3 : " << str3 << endl;
// 连接 str1 和 str2
str3 = str1 + str2;
cout << "str1 + str2 : " << str3 << endl;
// 连接后,str3 的总长度
len = str3.size();
cout << "str3.size() : " << len << endl;
return 0;
}
Указатели С++
Указатели C++ просты и интересны. Выполнение некоторых задач программирования на C++ можно упростить с помощью указателей, а некоторые задачи, такие как динамическое выделение памяти, невозможно выполнить без указателей.
Каждая переменная имеет ячейку памяти, и каждая ячейка памяти определяет адрес, доступ к которому можно получить с помощью оператора дефиса (&), который представляет адрес в памяти.
пример
#include <iostream>
using namespace std;
int main ()
{
int var1;
char var2[10];
cout << "var1 变量的地址: ";
cout << &var1 << endl;
cout << "var2 变量的地址: ";
cout << &var2 << endl;
return 0;
}
Приведенный выше код компилируется и выполняется, давая следующий результат:
var1 变量的地址: 0xbfebd5c0
var2 变量的地址: 0xbfebd5b6
Что такое указатели?
Указатель — это переменная, значением которой является адрес другой переменной, то есть прямой адрес ячейки памяти. Как и любую другую переменную или константу, вы должны объявить указатель, прежде чем использовать его для хранения адреса другой переменной. Общая форма объявления переменной-указателя:
type *var-name;
Здесь type — это базовый тип указателя, который должен быть допустимым типом данных C++, а var-name — это имя переменной указателя. Звездочка *, используемая для объявления указателя, аналогична звездочке, используемой при умножении. Однако в этом утверждении звездочка используется для обозначения того, что переменная является указателем. Ниже приведены допустимые объявления указателей:
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
Фактический тип данных всех значений указателя, будь то целое число, число с плавающей запятой, символ или другие типы данных, одинаков и представляет собой длинное шестнадцатеричное число, представляющее адрес памяти. Единственная разница между указателями разных типов данных заключается в том, что тип данных переменной или константы, на которую указывает указатель, различен.
Использование указателей в C++
При использовании указателей часто выполняются следующие операции: определение переменной указателя, присвоение адреса переменной указателю и доступ к значению адреса, доступному в переменной указателя. Это делается с помощью унарных операторов, *
возвращающих значение переменной по адресу, указанному операндом.
пример
#include <iostream>
using namespace std;
int main ()
{
int var = 20; // 实际变量的声明
int *ip; // 指针变量的声明
ip = &var; // 在指针变量中存储 var 的地址
cout << "Value of var variable: ";
cout << var << endl;
// 输出在指针变量中存储的地址
cout << "Address stored in ip variable: ";
cout << ip << endl;
// 访问指针中地址的值
cout << "Value of *ip variable: ";
cout << *ip << endl;
return 0;
}
Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:
Value of var variable: 20
Address stored in ip variable: 0xbfc601ac
Value of *ip variable: 20
&: Адрес ----------------------------------------------- - -------------------------------------------------- -- ----------------------------------------------- * : ценить
Ссылки на С++
Ссылочная переменная — это псевдоним, то есть другое имя существующей переменной. После инициализации ссылки на переменную вы можете использовать имя ссылки или имя переменной, чтобы указать на переменную.
Ссылки на C++ против указателей
Ссылки легко спутать с указателями, и между ними есть три основных различия:
- Нулевых ссылок нет. Ссылки должны быть связаны с действительным участком памяти.
- Как только ссылка инициализируется для объекта, она не может указывать на другой объект. Указатель может указывать на другой объект в любое время.
- Ссылки должны быть инициализированы во время создания. Указатели могут быть инициализированы в любое время.
Создание ссылок в C++.
Думайте об имени переменной как о метке, которую переменная прикрепляет к ячейке памяти, а о ссылке можно думать как о второй метке, которую переменная прикрепляет к ячейке памяти. Таким образом, вы можете получить доступ к содержимому переменной по ее исходному имени или по ссылке. Например:
int i = 17;
Мы можем объявить ссылочную переменную для i следующим образом:
int& r = i;
double& s = d;
В этих объявлениях & читается как ссылка. Таким образом, первое объявление может читаться как «r — это ссылка на целое число, инициализированное значением i», а второе объявление может читаться как «s — это ссылка на двойное число, инициализированное значением d». В следующем примере используются int и двойные ссылки:
пример
#include <iostream>
using namespace std;
int main ()
{
// 声明简单的变量
int i;
double d;
// 声明引用变量
int& r = i;
double& s = d;
i = 5;
cout << "Value of i : " << i << endl;
cout << "Value of i reference : " << r << endl;
d = 11.7;
cout << "Value of d : " << d << endl;
cout << "Value of d reference : " << s << endl;
return 0;
}
Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:
Value of i : 5
Value of i reference : 5
Value of d : 11.7
Value of d reference : 11.7
Использование метода аватара в Наруто в качестве метафоры:
-
Указатель на самом деле больше похож на обычный метод аватара: даже если аватар разобьется, он не повлияет на себя;
-
Ссылки больше похожи на несколько теневых клонов: несколько теневых клонов изменяются и сами подвергаются воздействию.
B ссылается на A: это эквивалентно тому, что B заимствует адрес памяти и значение A, и если какое-либо из A и B изменяется, одновременно изменяется AB.
Указатель B указывает на A: B заимствует значение A, но адрес памяти B перераспределяется, что отличается от адреса A.
Базовый ввод и вывод C++
Стандартная библиотека C++ предоставляет богатый набор функций ввода-вывода, которые описывают самые основные и распространенные операции ввода-вывода в программировании на C++.
Ввод-вывод в C++ происходит в потоках, которые представляют собой последовательности байтов. Если поток байтов передается от устройства (например, клавиатуры, диска, сетевого подключения и т. д.) в память, это называется операцией ввода. Если поток байтов передается из памяти на устройство (например, экран дисплея, принтер, дисковод, сетевое соединение и т. д.), это называется операцией вывода.
Заголовочные файлы библиотеки ввода-вывода
пример
#include <iostream>
using namespace std;
int main( )
{
char str[] = "Hello C++";
cout << "Value of str is : " << str << endl;
}
Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:
Value of str is : Hello C++
Компилятор C++ выбирает соответствующий оператор вставки потока для отображения значения на основе типа данных выводимой переменной. Оператор << перегружен для вывода элементов данных встроенных типов (целые числа, числа с плавающей запятой, двойные значения, строки и указатели).
Оператор вставки потока << можно использовать в операторе несколько раз, как показано в примере выше, endl используется для добавления новой строки в конце строки.
пример
#include <iostream>
using namespace std;
int main( )
{
char name[50];
cout << "请输入您的名称: ";
cin >> name;
cout << "您的名称是: " << name << endl;
}
Когда приведенный выше код компилируется и выполняется, он запрашивает у пользователя имя. Когда пользователь вводит значение и нажимает клавишу Enter, отображаются следующие результаты:
请输入您的名称: cplusplus
您的名称是: cplusplus
В зависимости от типа данных входного значения компилятор C++ выбирает соответствующий оператор извлечения потока для извлечения значения и сохранения его в заданной переменной.
Оператор извлечения потока >> можно использовать в операторе несколько раз. Если требуется ввести несколько данных, можно использовать следующий оператор:
cin >> name >> age;
Это эквивалентно следующим двум утверждениям:
cin >> name;
cin >> age;
Стандартный поток журнала (засор)
Предопределенный объект clog является экземпляром класса iostream. Объект засорения прикрепляется к стандартному устройству вывода, которым обычно является также дисплей, но объект засорения буферизуется. Это означает, что каждый поток, вставленный в засор, сначала сохраняется в буфере и не выводится до тех пор, пока буфер не заполнится или не будет очищен.
clog также используется вместе с оператором вставки потока << следующим образом:
пример
#include <iostream>
using namespace std;
int main( )
{
char str[] = "Unable to read....";
clog << "Error message : " << str << endl;
}
Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:
Error message : Unable to read....
Структуры данных C++
Массивы C/C++ позволяют определять переменные, которые могут хранить элементы данных одного и того же типа, но структуры — это еще один определяемый пользователем тип данных, доступный в C++, который позволяет хранить элементы данных разных типов.
Для представления записи используется структура. Предположим, вы хотите отслеживать активность книг в библиотеке. Возможно, вам потребуется отслеживать следующие свойства каждой книги:
Title :标题
Author :作者
Subject :类目
Book ID :书的 ID
Определение структуры
Чтобы определить структуру, вы должны использовать оператор struct. Оператор struct определяет новый тип данных, который содержит несколько членов.Формат оператора struct следующий:
struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;
type_name — это имя типа структуры,member_type1member_name1 — это стандартное определение переменной, например int i или float f, или другие допустимые определения переменных. В конце определения структуры, перед последней точкой с запятой, вы можете указать одну или несколько переменных структуры, это необязательно. Ниже необходимо объявить структуру типа Books, переменная — book:
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
Доступ к членам структуры
Для доступа к членам структуры мы используем оператор доступа к членам (.). Оператор доступа к члену — это точка между именем переменной структуры и членом структуры, к которому мы хотим получить доступ.
пример
#include <iostream>
#include <cstring>
using namespace std;
// 声明一个结构体类型 Books
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
Books Book1; // 定义结构体类型 Books 的变量 Book1
Books Book2; // 定义结构体类型 Books 的变量 Book2
// Book1 详述
strcpy( Book1.title, "C++ 教程");
strcpy( Book1.author, "Hello");
strcpy( Book1.subject, "编程语言");
Book1.book_id = 12345;
// Book2 详述
strcpy( Book2.title, "CSS 教程");
strcpy( Book2.author, "World");
strcpy( Book2.subject, "前端技术");
Book2.book_id = 12346;
// 输出 Book1 信息
cout << "第一本书标题 : " << Book1.title <<endl;
cout << "第一本书作者 : " << Book1.author <<endl;
cout << "第一本书类目 : " << Book1.subject <<endl;
cout << "第一本书 ID : " << Book1.book_id <<endl;
// 输出 Book2 信息
cout << "第二本书标题 : " << Book2.title <<endl;
cout << "第二本书作者 : " << Book2.author <<endl;
cout << "第二本书类目 : " << Book2.subject <<endl;
cout << "第二本书 ID : " << Book2.book_id <<endl;
return 0;
}
В примере определяется тип структуры Books и две его переменные Book1 и Book2. Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:
第一本书标题 : C++ 教程
第一本书作者 : Hello
第一本书类目 : 编程语言
第一本书 ID : 12345
第二本书标题 : CSS 教程
第二本书作者 : World
第二本书类目 : 前端技术
第二本书 ID : 12346
Структуры как аргументы функции
Структуры могут использоваться в качестве параметров функции, а метод передачи параметров аналогичен другим типам переменных или указателей.
пример
#include <iostream>
#include <cstring>
using namespace std;
void printBook( struct Books book );
// 声明一个结构体类型 Books
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
Books Book1; // 定义结构体类型 Books 的变量 Book1
Books Book2; // 定义结构体类型 Books 的变量 Book2
// Book1 详述
strcpy( Book1.title, "C++ 教程");
strcpy( Book1.author, "Hello");
strcpy( Book1.subject, "编程语言");
Book1.book_id = 12345;
// Book2 详述
strcpy( Book2.title, "CSS 教程");
strcpy( Book2.author, "World");
strcpy( Book2.subject, "前端技术");
Book2.book_id = 12346;
// 输出 Book1 信息
printBook( Book1 );
// 输出 Book2 信息
printBook( Book2 );
return 0;
}
void printBook( struct Books book )
{
cout << "书标题 : " << book.title <<endl;
cout << "书作者 : " << book.author <<endl;
cout << "书类目 : " << book.subject <<endl;
cout << "书 ID : " << book.book_id <<endl;
}
Когда приведенный выше код скомпилирован и выполнен, он дает следующий результат:
书标题 : C++ 教程
书作者 : Hello
书类目 : 编程语言
书 ID : 12345
书标题 : CSS 教程
书作者 : World
书类目 : 前端技术
书 ID : 12346
Указатели на структуры.
Вы можете определять указатели на структуры аналогично указателям на переменные других типов, следующим образом:
struct Books *struct_pointer;
Адрес структурной переменной может быть сохранен в переменной-указателе, определенной выше. Чтобы найти адрес структурной переменной, поставьте оператор & перед именем структуры:
struct_pointer = &Book1;
Чтобы получить доступ к членам структуры с помощью указателя на эту структуру, ->
необходимо использовать оператор:
struct_pointer->title;
Перепишите приведенный выше пример, используя указатели на структуры:
пример
#include <iostream>
#include <cstring>
using namespace std;
void printBook( struct Books *book );
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
Books Book1; // 定义结构体类型 Books 的变量 Book1
Books Book2; // 定义结构体类型 Books 的变量 Book2
// Book1 详述
strcpy( Book1.title, "C++ 教程");
strcpy( Book1.author, "Hello");
strcpy( Book1.subject, "编程语言");
Book1.book_id = 12345;
// Book2 详述
strcpy( Book2.title, "CSS 教程");
strcpy( Book2.author, "World");
strcpy( Book2.subject, "前端技术");
Book2.book_id = 12346;
// 通过传 Book1 的地址来输出 Book1 信息
printBook( &Book1 );
// 通过传 Book2 的地址来输出 Book2 信息
printBook( &Book2 );
return 0;
}
// 该函数以结构指针作为参数
void printBook( struct Books *book )
{
cout << "书标题 : " << book->title <<endl;
cout << "书作者 : " << book->author <<endl;
cout << "书类目 : " << book->subject <<endl;
cout << "书 ID : " << book->book_id <<endl;
}
ключевое слово typedef
Вот более простой способ определения структур, в которых вы можете «назначать псевдоним» создаваемому вами типу. Например:
typedef struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
}Books;
Books можно использовать напрямую для определения переменных типа Books без использования ключевого слова struct:
Books Book1, Book2;
Неструктурные типы можно определить с помощью ключевого слова typedef следующим образом:
typedef long int *pint32;
pint32 x, y, z;
x, y и z — указатели на long int.