Базовый вводный курс по C++ (4)

7 указатель

7.1 Основные понятия указателей

Функция указателя: Доступ к памяти возможен косвенно через указатель.Номер
памяти записывается с 0, обычно представленный шестнадцатеричными числами.Переменная
-указатель может использоваться для сохранения адреса.

7.2 Определение и использование переменных-указателей

Синтаксис определения переменной указателя: тип данных * имя переменной,
пример:

int main() 
{
    
    
	//1、指针的定义
	int a = 10; //定义整型变量a	
	//指针定义语法: 数据类型 * 变量名 ;
	int * p;
	//指针变量赋值
	p = &a; //指针指向变量a的地址
	cout << &a << endl; //打印数据a的地址
	cout << p << endl;  //打印指针变量p
	//2、指针的使用
	//通过*操作指针变量指向的内存
	cout << "*p = " << *p << endl;
	system("pause");
	return 0;
}

Разница между переменными-указателями и обычными переменными.
Обычные переменные хранят данные, а переменные-указатели хранят адреса
. Переменные-указатели могут использовать оператор «*» для управления пространством памяти, на которое указывает переменная-указатель. Этот процесс называется разыменованием. Резюме 1
: Мы можем пройти Символ & получает адрес переменной
Итог 2: Используйте указатель для записи адреса
Итог 3: Разыменуйте переменную указателя, и вы можете манипулировать памятью, на которую указывает указатель

7.3 Объем памяти, занимаемый указателями

Вопрос: Указатель также является типом данных, так сколько же памяти занимает этот тип данных?
Пример:

int main() 
{
    
    
	int a = 10;
	int * p;
	p = &a; //指针指向数据a的地址
	cout << *p << endl; //* 解引用
	cout << sizeof(p) << endl;
	cout << sizeof(char *) << endl;
	cout << sizeof(float *) << endl;
	cout << sizeof(double *) << endl;
	system("pause");
	return 0;
}

Резюме: Все типы указателей имеют размер 4 байта в 32-разрядной операционной системе.

7.4 Нулевые указатели и дикие указатели

Нулевой указатель: Переменная-указатель указывает на место в памяти с номером 0.
Цель: Инициализировать переменную-указатель
. Примечание. Память, на которую указывает нулевой указатель, недоступна
Пример 1: Нулевой указатель

int main() 
{
    
    
	//指针变量p指向内存地址编号为0的空间
	int * p = NULL;
	//访问空指针报错 
	//内存编号0 ~255为系统占用内存,不允许用户访问
	cout << *p << endl;
	system("pause");
	return 0;
}

Дикий указатель: Переменная указателя указывает на недопустимое место в памяти
Пример 2: Дикий указатель

int main() 
{
    
    
	//指针变量p指向内存地址编号为0x1100的空间
	int * p = (int *)0x1100;
	//访问野指针报错 
	cout << *p << endl;
	system("pause");
	return 0;
}

Резюме: пустые указатели и дикие указатели — это не то пространство, к которому мы обращаемся, поэтому не обращайтесь

7.5 константный модифицированный указатель

Существует три ситуации для const модифицированных указателей
const модифицированных указателей — константных указателей
const модифицированных констант — констант указателя
const модифицируют указатели и константы

Примеры:

int main() 
{
    
    
	int a = 10;
	int b = 10;
	//const修饰的是指针,指针指向可以改,指针指向的值不可以更改
	const int * p1 = &a; 
	p1 = &b; //正确
	//*p1 = 100;  报错
	//const修饰的是常量,指针指向不可以改,指针指向的值可以更改
	int * const p2 = &a;
	//p2 = &b; //错误
	*p2 = 100; //正确
    //const既修饰指针又修饰常量
	const int * const p3 = &a;
	//p3 = &b; //错误
	//*p3 = 100; //错误
	system("pause");
	return 0;
}

Советы: Посмотрите, является ли правая часть const указателем или константой, если это указатель, это постоянный указатель, если это константа, это константа указателя.

7.6 Указатели и массивы

Функция: Используйте указатели для доступа к элементам в массиве
. Пример:

int main() 
{
    
    
	int arr[] = {
    
     1,2,3,4,5,6,7,8,9,10 };
	int * p = arr;  //指向数组的指针
	cout << "第一个元素: " << arr[0] << endl;
	cout << "指针访问第一个元素: " << *p << endl;
	for (int i = 0; i < 10; i++)
	{
    
    
		//利用指针遍历数组
		cout << *p << endl;
		p++;
	}
	system("pause");
	return 0;
}

7.7 Указатели и функции

Функция: используйте указатель в качестве параметра функции, чтобы изменить значение фактического параметра.
示例:

//值传递
void swap1(int a ,int b)
{
    
    
	int temp = a;
	a = b; 
	b = temp;
}
//地址传递
void swap2(int * p1, int *p2)
{
    
    
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}
int main() 
{
    
    
	int a = 10;
	int b = 20;
	swap1(a, b); // 值传递不会改变实参
	swap2(&a, &b); //地址传递会改变实参
	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	system("pause");
	return 0;
}

Резюме: если вы не хотите изменять фактический параметр, передайте его по значению; если вы хотите изменить фактический параметр, передайте его по адресу

7.8 Указатели, массивы, функции

Пример:

//冒泡排序函数
void bubbleSort(int * arr, int len)  //int * arr 也可以写为int arr[]
{
    
    
	for (int i = 0; i < len - 1; i++)
	{
    
    
		for (int j = 0; j < len - 1 - i; j++)
		{
    
    
			if (arr[j] > arr[j + 1])
			{
    
    
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}
//打印数组函数
void printArray(int arr[], int len)
{
    
    
	for (int i = 0; i < len; i++)
	{
    
    
		cout << arr[i] << endl;
	}
}
int main() 
{
    
    
	int arr[10] = {
    
     4,3,6,9,1,2,10,8,7,5 };
	int len = sizeof(arr) / sizeof(int);
	bubbleSort(arr, len);
	printArray(arr, len);
	system("pause");
	return 0;
}

Резюме: когда имя массива передается функции в качестве параметра, оно вырождается в указатель на первый элемент.

8 структур

8.1 Основная концепция структуры

Структуры — это определяемые пользователем типы данных, которые позволяют пользователям хранить различные типы данных.

8.2 Определение и использование структуры

Синтаксис: структура имя структуры {список элементов структуры};
существует три способа создания переменных через структуру:
имя структуры структуры имя переменной имя
структуры структуры имя переменной = {значение элемента 1, значение элемента 2...}
При определении структуры По способ создать

пример переменной:

//结构体定义
struct student
{
    
    
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
}stu3; //结构体变量创建方式3 
int main() 
{
    
    
	//结构体变量创建方式1
	struct student stu1; //struct 关键字可以省略
	stu1.name = "张三";
	stu1.age = 18;
	stu1.score = 100;
	cout << "姓名:" << stu1.name << " 年龄:" << stu1.age  << " 分数:" << stu1.score << endl;
	//结构体变量创建方式2
	struct student stu2 = {
    
     "李四",19,60 };
	cout << "姓名:" << stu2.name << " 年龄:" << stu2.age  << " 分数:" << stu2.score << endl;
	stu3.name = "王五";
	stu3.age = 18;
	stu3.score = 80;
	cout << "姓名:" << stu3.name << " 年龄:" << stu3.age  << " 分数:" << stu3.score << endl;
	system("pause");
	return 0;
}

Резюме 1: Ключевое слово при определении структуры — struct, которое нельзя опустить
Резюме 2: При создании структурной переменной ключевое слово struct можно опустить
Резюме 3: Структурная переменная использует оператор ''.'' для доступа к членам

8.3 Массивы структур

Функция: поместите пользовательскую структуру в массив для простоты обслуживания.
Синтаксис: struct имя структуры имя массива [количество элементов] = { {} , {} , … {} }
Пример:

//结构体定义
struct student
{
    
    
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
}
int main() 
{
    
    
	//结构体数组
	struct student arr[3]=
	{
    
    
		{
    
    "张三",18,80 },
		{
    
    "李四",19,60 },
		{
    
    "王五",20,70 }
	};
	for (int i = 0; i < 3; i++)
	{
    
    
		cout << "姓名:" << arr[i].name << " 年龄:" << arr[i].age << " 分数:" << arr[i].score << endl;
	}
	system("pause");
	return 0;
}

8.4 Указатели структуры

Функция: Доступ к членам структуры через указатель
Используйте оператор -> для доступа к свойствам структуры через указатель структуры
Пример:

//结构体定义
struct student
{
    
    
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
};
int main() 
{
    
    
	struct student stu = {
    
     "张三",18,100, };
	struct student * p = &stu;
	p->score = 80; //指针通过 -> 操作符可以访问成员
	cout << "姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl;
	system("pause");
	return 0;
}

8.5 Вложенная структура структуры

Функция: Элементы в структуре могут быть другой структурой
. Например: каждый учитель обучает ученика, а в структуре учителя записывает структуру ученика.
Пример:

//学生结构体定义
struct student
{
    
    
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
};
//教师结构体定义
struct teacher
{
    
    
    //成员列表
	int id; //职工编号
	string name;  //教师姓名
	int age;   //教师年龄
	struct student stu; //子结构体 学生
};
int main() 
{
    
    
	struct teacher t1;
	t1.id = 10000;
	t1.name = "老王";
	t1.age = 40;
	t1.stu.name = "张三";
	t1.stu.age = 18;
	t1.stu.score = 100;
	cout << "教师 职工编号: " << t1.id << " 姓名: " << t1.name << " 年龄: " << t1.age << endl;
	cout << "辅导学员 姓名: " << t1.stu.name << " 年龄:" << t1.stu.age << " 考试分数: " << t1.stu.score << endl;
	system("pause");
	return 0;
}

Резюме: В структуре другая структура может быть определена как элемент для решения практических задач.

8.6 Структура как параметр функции

Функция: передать структуру в качестве параметра функции.Есть
два способа передачи:
передача по значению и
передача по адресу
Пример:

//学生结构体定义
struct student
{
    
    
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
};
//值传递
void printStudent(student stu )
{
    
    
	stu.age = 28;
	cout << "子函数中 姓名:" << stu.name << " 年龄: " << stu.age  << " 分数:" << stu.score << endl;
}
//地址传递
void printStudent2(student *stu)
{
    
    
	stu->age = 28;
	cout << "子函数中 姓名:" << stu->name << " 年龄: " << stu->age  << " 分数:" << stu->score << endl;
}
int main() 
{
    
    
	student stu = {
    
     "张三",18,100};
	//值传递
	printStudent(stu);
	cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age << " 分数:" << stu.score << endl;
	cout << endl;
	//地址传递
	printStudent2(&stu);
	cout << "主函数中 姓名:" << stu.name << " 年龄: " << stu.age  << " 分数:" << stu.score << endl;
	system("pause");
	return 0;
}

Резюме: если вы не хотите изменять данные в основной функции, передайте их по значению, иначе передайте по адресу.

8.7 Сценарии использования const в структурах

Функция: Используйте const для предотвращения неправильной работы
. Пример:

//学生结构体定义
struct student
{
    
    
	//成员列表
	string name;  //姓名
	int age;      //年龄
	int score;    //分数
};
//const使用场景
void printStudent(const student *stu) //加const防止函数体中的误操作
{
    
    
	//stu->age = 100; //操作失败,因为加了const修饰
	cout << "姓名:" << stu->name << " 年龄:" << stu->age << " 分数:" << stu->score << endl;

}
int main() 
{
    
    
	student stu = {
    
     "张三",18,100 };
	printStudent(&stu);
	system("pause");
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/fjj2397194209/article/details/131304308
Recomendado
Clasificación