13C++之指针基础,数组与函数关系

6 指针

6.1 指针的基本概念

指针的作用:可以通过指针间访问内存。

  1. 内存编号是从0开始记录的,一般用十六进制数字表示。
  2. 可以利用指针变量保存地址。

6.2 指针变量的定义和使用

语法: 数据类型 * 指针变量名;

#include<iostream>
using namespace std;

int main()
{
	//1.定义指针
	int a = 32;
	int* p; 
	//让指针记录变量a的地址
	p = &a;
	cout << "a变量的地址为:" << &a << endl;
	cout << "p =	 " << p << endl;
	/*2,使用指针
	通过解引用的方式来找到指针指向的内存
	指针前加 * 代表解引用,找到指针指向的内存中的数据
	*/
	cout << "*p =	" << *p << endl;  //指针的解引用
	*p = 100;
	cout << "通过间接修改后a =  " << a << endl;
	cout << "通过指针间接修改后的指针地址 p = " <<p<< endl;
	cout << "通过指针间接修改后的指针 *p = " <<*p<< endl;
	system("pause");
	return 0;
}

结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wVbZmYmV-1647678543784)(C:/Users/dfghkl/AppData/Roaming/Typora/typora-user-images/image-20220319135050400.png)]

6 .3 指针所占内存空间

提问:指针也是一种数据类型,那么这种数据类型占用多少内存空间?

例如:int 类型的指针在32位操作系统下,占4个字节,64位系统下占用8个字节。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kSRvJ74l-1647678543789)(C:/Users/dfghkl/AppData/Roaming/Typora/typora-user-images/image-20220319135547897.png)]

#include<iostream>
using namespace std;

int main42()
{
	//1.定义指针
	int a = 32;
	int* p; 
	//让指针记录变量a的地址
	p = &a;
	cout << "a变量的地址为:" << &a << endl;
	cout << "p =	 " << p << endl;
	/*2,使用指针
	通过解引用的方式来找到指针指向的内存
	指针前加 * 代表解引用,找到指针指向的内存中的数据
	*/
	cout << "*p =	" << *p << endl;  //指针的解引用
	*p = 100;
	cout << "通过间接修改后a =  " << a << endl;
	cout << "通过指针间接修改后的指针地址 p = " <<p<< endl;
	cout << "通过指针间接修改后的指针 *p = " <<*p<< endl;
	system("pause");
	return 0;
}

6.4 空指针和野指针

空指针:指针变量指向内存中编号为0的空间。

用途:初始化指针变量。

注意:空指针指向的内存是不可以访问的。

#include<iostream>
using namespace std;
int main()
{
	//空指针
	//1.空指针用于指针变量进行初始化
	int* p = NULL;

	//2.空指针是不可以进行访问的
	//0~255之间的内存编号是系统占用的,因此不可以访问
	*p = 100;


	system("pause");
	return 0;
}

野指针:指针变量指向非法的内存空间

#include<iostream>
using namespace std;
int main()
{
	//野指针
	//指针变量p指向内存地址编号为0x1100的空间
	int* p = (int *)0x1100;
	cout << *p << endl;
	system("pause");
	return 0;
}

注意:在编程过程中要避免出现野指针和空指针,它们是挺危险的

6.5 const 修饰的指针

const修饰指针有三种情况:

  1. const修饰指针…常量指针(指针指向的值不可以改,指针的指向可以改)
  2. const修饰常量…指针常量(指针指向的值可以改,指针的指向不可以改)
  3. const即修饰指针,又修饰常量 (指针的指向和指针所指向的值 都不可以改)
#include<iostream>
using namespace std;
int main()
{
	//1.const修饰指针		常量指针
	int a = 10, b = 20;
	const int* p = &a;	//指针*p指向a
	//指针指向的值不可以改,指针的指向可以改
	//*p	=	20;错误
	p = &b;	//指针的指向可以修改,正确

	//2.const修饰常量     指针常量
	//指针指向的值可以改,指针的指向不可以改
	int* const p2 = &a;
	*p2 = 34;//正确
	//p2 = &b;//错误,指针的指向不可以修改

	//3.const修饰指针和常量
	const int* const	p3 = &a;
	//指针的指向和指针所指向的值 都不可以改
	//*p3 = 100;		错误
	//p3 = &b;	错误

	system("pause");
	return 0;
}

6.6 指针和数组

作用:利用指针访问数组中元素

#include<iostream>
using namespace std;
int main()
{
	/*
	指针和数组
	利用指针访问数组中的元素
	*/
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//cout << "第一个元素为:" << arr[0] << endl;
	cout << "第一个元素为:" << *arr << endl;

	int* p = arr;				//arr就是数组首地址 
	cout << "* p =" << *p << endl;
	p++;							//因为*p是四节的指针,自增1后指向下一个元素
	
	cout << "利用指针遍历数组:" << endl;
	int* p2 = arr;
	for (int  i = 0; i < 10; i++)
	{
		cout << "arr ["<<i<<"] = " << *p2 << endl;
		p2++;	//通过指针自增指向下一个元素
	}
	system("pause");
	return 0;
}

6.7 指针和函数

作用:利用指针做函数参数,可以修改实参的值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aL57eTV3-1647678543799)(C:/Users/dfghkl/AppData/Roaming/Typora/typora-user-images/image-20220319154420716.png)]

#include<iostream>
using namespace std;
//值传递
void  swap1(int a, int b)
{
	int temp;
	temp = a;
	a = b;
	b = temp;
	cout << "swap1中a = " << a << endl;
	cout << "swap1中b = " << b << endl;
}
//地址传递
void swap2(int* p1, int* p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;

}
int main()
{
	int a = 10, b = 20;
	//值传递函数调用不会改变实参
	swap1(a, b);

	cout << "a = " << a << endl;
	cout << "b = " << b << endl;
	//地址传递函数调用会改变实参
	swap2(&a, &b);

	cout << "地址调用后 a = " << a << endl;
	cout << "地址调用后 b = " << b << endl;



	system("pause");
	return 0;
}

6.8 指针、数组、函数

案例描述:封装一个函数,利用冒泡排序,实现整形数组的排序,例如:int arr[10] = {4,3,6,9,1,2,10,8,7,5};

#include<iostream>
using namespace std;
//2.创建冒泡排序函数 参数1是数组的首地址  参数2是数组长度
void bubbleSort(int* arr, int len)		//也可以写为int arr[]
{
	for (int  i = 0; i < len; i++)
	{
		for (int j =0; j < len - 1 - i; j++)
		{
			int temp = 0;

			if (arr[j] > arr[j+1])
			{
				temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

// 3.打印数组输出
void  printArr(int arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << "arr [" << i << " ] =" << arr[i] << endl;

	}
}
int main()
 {
	//1.先创建数组
	int  arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
	int len = sizeof(arr) / sizeof(arr[0]);
	//2.创建冒泡排序函数

	//3.调用冒泡排序函数
	bubbleSort(arr, len);

	//4.打印排序后的数组输出
	printArr(arr,len);
	system("pause");
	return 0;
}

谢谢你的点赞,评论和转发 ( ^ o ^)/~。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目描述 现在又到了一年一度的圣诞节,珂朵莉想给自己的好友爱丽丝送一份礼物,她决定送一串十进制整数。 珂朵莉想她的礼物与众不同,这串整数应该是一个不重复的严格递增序列。她需要你的帮助,编写一个程序将一个给定范围内的递增序列分成若干份,使得每份序列长度相同,并且每份序列中的整数的和相等。 珂朵莉要求每份序列的长度最大,每份序列中的整数的和最小。特别是,当总的序列长度无法被平分或者根本没有满足条件的序列时,程序应该输出“Impossible” 。 输入格式 输入的第一行包含一个整数 $L$, 表示递增序列的长度 $(1 \leq L \leq 50000)$。 接下来是两个整数 $A,B$,描述了递增序列的范围,这个范围包含了从 $A$ 到 $B$ 中的所有递增整数。$(1 \leq A < B < 10^{12})$。 输出格式 如果能够平分成若干份,输出每份的长度以及每份中的整数和(每行一个)。 否则输出 “Impossible”(不含引号)。 题解 本题就是把 $A$ 到 $B$ 中的个数均分成 $L$ 组,每组数和最小。 由于 $A$ 到 $B$ 中的个数不大于 $50000$, 所以我们可以枚举每个分组中的最小数, 然后出第一个分组,然后让剩余的分组取最小的不重复的数值, 如果不行就回溯,把刚刚这个数从序列中删除即可。 做法并不难想, 由于是探索性质, 如果可以储存数值,就大大减少了枚举。 这里给出我的做法: - 列举了状态的结构体: struct state { ll _s; //起始数 vector<ll> _seq; //序列 vector<ll> _cap; //每个分组的和 bool operator<(const state &r) const { return _s < r._s; } }; map<state, bool> _visited; - 按照长度升序和起始值升序排序 - 定义了一个小根堆用于储存这些状态,目的是使得将现在最短的路径优先尝试 - 在每次处理完新建的节点后继续在小根堆中选节点再处理,因此类似Djoiskra的最短路算法。 - 最后输出序列: (只保留经过的序列会减少一些难以捉摸的错误) 因为最初的序列有 L 个,所以一定是每个序列 L 个合并的(既然有合并了就是分成 L 份并不是分成 n 份,不然就没有合并的必要)。 语言:C++,C,python3等 C++ 代码

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值