C++(只学这套就够了) 第1阶段基础入门07—指针

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;
}

总结:所有指针类型在32位操作系统下是4个字节

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修饰指针有三种情况

  1. const修饰指针 — 常量指针
  2. const修饰常量 — 指针常量
  3. 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 指针、数组、函数

案例描述: 封装一个函数,利用冒泡排序,实现对整型数组的升序排序

例如数组:int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };

示例:

//冒泡排序函数
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;
}

总结:当数组名传入到函数作为参数时,被退化为指向首元素的指针

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 第1阶段c 匠心之作从0到1入门是一个学习计算机编程语言C的项目。这个项目适合初学者,让他们从零开始学习C语言,逐步建立起对编程的基本理解和技能。 在这个项目中,学习者将了解C语言的基本语法和数据类型,学习如何在C语言中编写简单的程序。他们将学会如何使用变量和常量,在程序中存储和操作数据。他们还将学习如何使用条件语句和循环语句,来控制程序的流程和执行。 此外,学习者还将了解函数和数组的概念和用法。他们将学会如何定义和调用函数,以及如何使用数组来存储和处理大量的数据。他们还将学习如何使用指针,在程序中访问和操作内存中的数据。 在这个项目的最后阶段,学习者将有机会使用所学的知识,编写一些简单但有意义的小项目。这些项目可以是简单的计算器,猜数字游戏或其他有趣的应用。通过实践,学习者将能巩固他们在C语言编程方面的基础,并培养他们解决问题和思考编程逻辑的能力。 总的来说,第1阶段c 匠心之作从0到1入门是一个系统化的学习计划,旨在帮助学习者从零开始学习C语言编程。通过这个项目,学习者将建立起对编程的基本理解和技能,并能编写一些简单但有意义的小项目。这个项目不仅有助于学习者进一步提高他们的编程能力,也可以为他们日后学习更高级的编程语言奠定坚实的基础。 ### 回答2: 首先,第1阶段的c编程可以被称为“匠心之作”,因为它是一个从零到一的入门级课程。在这个阶段,学习者将掌握c编程的基础知识和技能。 在这门课程中,学习者将从基本概念开始学习c编程。他们将了解变量、数据类型、运算符等基本概念,并学习如何使用它们来解决问题。此外,学习者还将学习如何使用控制结构,如条件语句和循环语句,来控制程序的执行流程。 在学习这门课程的过程中,学习者将通过一系列实践项目来巩固他们的理论知识。他们将编写简单的程序来实现一些基本功能,如计算器、猜数字游戏等。通过这些项目,学习者将学会如何将复杂的问题分解为更小的子问题,并将它们逐步解决。 此外,学习者还将学习如何调试他们的程序。他们将学会如何使用调试工具来找出程序中的错误,并学习一些常见的错误类型和解决方法。这将帮助他们提高他们的编程技能,并培养他们解决问题的能力。 总之,第1阶段的c编程课程可以被称为“匠心之作”,因为它为学习者提供了一个从零到一的入门级课程。通过学习这门课程,学习者将掌握c编程的基本概念和技能,并培养他们的问题解决能力。这将为他们进一步学习更高级的c编程提供坚实的基础。 ### 回答3: 第1阶段的c课程是一个精心设计的从零开始的入门课程,旨在帮助学习者从无到有地掌握c编程语言。这门课程是一项工匠式的作品,注重细节和实践,为学习者提供了一个全面而系统的学习经验。 这门课程的教学团队投入了大量精力和心血,以确保学习者可以获得最佳的学习效果。课程内容经过精心规划和组织,从基本的语法和概念开始,逐步引导学习者掌握c语言的各个方面。通过丰富的教学材料、实例和练习,学习者可以深入了解c语言的特性和用法。 除了理论学习,这门课程还注重实践。学习者将有机会参与到各种编程项目中,通过编写实际的c代码来巩固所学知识。这不仅有助于理解抽象的概念,还可以提高学习者的编程能力和自信心。 与传统的教学方式不同,c第1阶段课程采用了多种教学方法和学习资源。学习者可以通过在线论坛与教学团队和其他学习者交流和分享,获得更多的互动和反馈。此外,课程还提供了丰富的学习支持和辅导,帮助学习者解决问题和提高学习效率。 这门c第1阶段课程旨在帮助学习者从零开始学习c语言,了解编程的基础原理和技巧。它是教学团队用心打造的一项匠心之作,旨在培养学习者的编程能力和创造力。无论是对于编程新手还是有一定经验的学习者来说,这门课程都是一个宝贵的学习资源,能帮助他们快速入门并掌握c语言的精髓。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值