c++ 指针

news2024/12/24 11:25:52

目录

1.指针的基本概念

 2.定义指针,使用指针

 3.指针所占的内存空间

4.空指针和野指针

4.1空指针

4.2野指针

 5.const修饰指针

 5.1常量指针

 5.2指针常量

 5.3const既修饰指针又修饰常量

6.指针和数组,利用指针访问数组

6.1概述 

 6.2使用数组名和下表访问

6.3使用数组名和指针

6.4使用指针变量访问数组

6.5总结 

7.指针和函数

7.1指针当作函数的参数

 7.2值传递和地址传递

 8.指针、数组、函数案例练习

8.1函数传递数组


1.指针的基本概念

 2.定义指针,使用指针

#include<iostream>
using namespace std;


int main()
{
	

    //1.定义指针
	int a = 10;
	//指针定义的语法:数据类型 *指针变量名
	int* p;
	//让指针记录变量a的地址,整型变量就定义整型指针
	p = &a;//&取变量的地址
	cout << "a的地址为:" << &a << endl;
	cout << "指针p为:" << p << endl;//指针就是地址,保存地址
	//2.使用指针
	//可以通过解引用的方式找到指针指向的内存中的数据
	//指针前加 * 代表解引用,找到指针指向的内存中的数据
	*p = 1000;
	cout << "a = " << a << endl;
	cout << "*p = " << *p << endl;
	system("pause");//按任意键继续

	return 0;

}

 3.指针所占的内存空间

 

#include<iostream>
using namespace std;


int main()
{
	

    //指针所占的内存空间大小
	int a = 10;
	int * p = &a;

	//在32位操作系统下,指针都是占4个字节空间大小,不管是什么数据类型
	//在64位操作系统下,指针都是占4个字节空间大小,不管是什么数据类型
	cout << "sizeof(int *) = " << sizeof(int *) << endl;
	//cout << "sizeof(int *) = " << sizeof(p) << endl;和上面等价
	cout << "sizeof(int *) = " << sizeof(double *) << endl;
	cout << "sizeof(int *) = " << sizeof(char *) << endl;
	system("pause");//按任意键继续

	return 0;

}

4.空指针和野指针

4.1空指针

#include<iostream>
using namespace std;


int main()
{
	//空指针:指向编号为0的指针为空指针
	//1.用于给指针变量进行初始化,如果指针一开始不知道指向哪合适,
	//那就指向编号为0的内存处
	//后期有地方指在重新更改指向就好
	int * p = NULL;
	int a = 100;
	p = &a;
	cout << p << endl;
	//2.空指针是不可以进行访问的
	//0~255之间的内存编号是系统占用的,因此不可以访问

	system("pause");//按任意键继续

	return 0;

}

4.2野指针

#include<iostream>
using namespace std;


int main()
{
	//野指针
	//在程序中,尽量避免使用野指针 
	int* p = (int*)0x1100;
    //访问指针报错
    cout<<*p<<endl;
	system("pause");//按任意键继续

	return 0;

}

 5.const修饰指针

 5.1常量指针

 5.2指针常量

 5.3const既修饰指针又修饰常量

记忆技巧 :*:指针,const:常量,所以

 const int *p:常量指针

int * const p:指针常量

可不可以修改的记忆技巧:

const后面是*p,对*p修改就是错误的,也就是,常量指针

指向可以改,指向的值不可以改。

const后面是p,对p的修改就是错误的,也就是,指针常量指向的值可以改,指向不可以改。

#include<iostream>
using namespace std;


int main()
{
	//1.const修饰指针,常量指针
	int a = 10;
	int b = 10;
	const int * p = &a;
	//指针指向的值不可以改,指针的指向可以改
	//*p=20错误
	p = &b;//正确

	//2.const修饰常量,指针常量
	int * const p1 = &a;
	//指针的指向不可以改,指针指向的值可以改
	*p1 = 30;//正确
	//p1=&b//错误
	// 
	//3.const既修饰指针又修饰常量
	const int* const p2 = &a;
	//指针的指向和指针指向的值都不可以改
	//*p2=200;//错误
	//p2=&b//错误
	system("pause");//按任意键继续

	return 0;

}

6.指针和数组,利用指针访问数组

6.1概述 

#include<iostream>
using namespace std;


int main()
{
	//指针和数组
	//利用指针访问数组中的元素

	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };


	int* p = arr;//数组名就是数组在内存中的首地址

	cout << "利用指针访问第一个元素:" << *p << endl;

	p++;//因为p本身是整型,加1后就主动往后面移4个字节
	cout << "利用指针访问第二个元素:" << *p << endl;

	cout << "利用指针输出数组元素" << endl;
	int* p1 = arr;
	for (int i = 0; i < 10; i++)
	{
		cout << "利用指针访问第" << (i + 1) << "个元素:" << *p1 << endl;
		p1++;
	}
	system("pause");//按任意键继续

	return 0;

}

 6.2使用数组名和下表访问

#include<iostream>
using namespace std;


int main()
{
	//指针和数组
	//利用指针访问数组中的元素

	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << endl;
	}
	system("pause");//按任意键继续

	return 0;

}

6.3使用数组名和指针

#include<iostream>
using namespace std;


int main()
{
	//指针和数组
	//利用指针访问数组中的元素

	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (int i = 0; i < 10; i++)
	{
		cout << *(arr+i) << endl;
	}
	system("pause");//按任意键继续

	return 0;

}

6.4使用指针变量访问数组

#include<iostream>
using namespace std;


int main()
{
	//指针和数组
	//利用指针访问数组中的元素

	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int* p = arr;//等价于int* p = &arr[0]
	int* p1 = &arr[0];
	int* p2 = arr;
	//第一种指针=1
	for (int i = 0; i < 10; i++)
	{
		cout << *p <<" ";
		p++;
	}
	cout << endl;
	//第二种
	for (int i = 0; i < 10; i++)
	{
		cout << *(p1 + i) <<" ";
	}
	cout << endl;
	//第三种
	for (int i = 0; i < 10; i++)
	{
		cout << p2[i] << " ";
	}
	cout << endl;
	system("pause");//按任意键继续

	return 0;

}

6.5总结 

下面进行总结看是否掌握

1、arr[i], *(p+i), *(a+i), p[i]都是等效的。

2.指针p可以++,不能写 arr++,因为arr是数组首地址、是常量

7.指针和函数

7.1指针当作函数的参数

#include<iostream>
using namespace std;

//实现两个数字进行交换
void swap01(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
	cout << "swap01 a = " << a << " " << "swap01 b = " << b << endl;
}

void swap02(int *p1, int *p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}
int main()
{
	//指针和函数

	//1.值传递
	int a = 10;
	int b = 20;
	swap01(a, b);
	cout << "a = " << a << " " << "b = " << b << endl;

	int c = 100;
	int d = 200;
	//2.地址传递
	//如果是地址传递,可以修改实参
	swap02(&c, &d);//传入c变量的地址,传入d变量的地址
	cout << "c= " << c << " " << "d = " << d << endl;

	system("pause");//按任意键继续

	return 0;

}

 7.2值传递和地址传递

 8.指针、数组、函数案例练习

8.1函数传递数组

第一种写法:

#include<iostream>
using namespace std;

//冒泡排序,参数1数组的首地址,参数2数组的长度
void bubbleSort(int* p, int len)
{
	int temp;
	for (int i = 0; i < len-1; i++)
	{
		for (int j = 0; j < len-1-i; j++)
		{
			if (p[j] > p[j + 1])
			{
				temp = p[j];
				p[j] = p[j + 1];
				p[j + 1] = temp;
			}
		}
	}
}
int main()
{
	int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
	
	//数组的长度
	int len = sizeof(arr) / sizeof(arr[0]);
	bubbleSort(arr,len);//数组名就是数组的首地址
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	system("pause");//按任意键继续

	return 0;

}

 第二种写法

#include<iostream>
using namespace std;

//冒泡排序,参数1数组的首地址,参数2数组的长度
void bubbleSort(int p[], int len)
{
	int temp;
	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - 1 - i; j++)
		{
			if (p[j] > p[j + 1])
			{
				temp = p[j];
				p[j] = p[j + 1];
				p[j + 1] = temp;
			}
		}
	}
}
int main()
{
	int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };

	//数组的长度
	int len = sizeof(arr) / sizeof(arr[0]);
	bubbleSort(arr, len);//数组名就是数组的首地址
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	system("pause");//按任意键继续

	return 0;

}

第三种写法:

#include<iostream>
using namespace std;

//冒泡排序,参数1数组的首地址,参数2数组的长度
void bubbleSort(int* p, int len)
{
	int temp;
	for (int i = 0; i < len-1; i++)
	{
		for (int j = 0; j < len-1-i; j++)
		{
			if (*(p+j) > *(p+j + 1))
			{
				temp = *(p+j);
				*(p+j) = *(p+j + 1);
				*(p + j + 1) = temp;
			}
		}
	}
}
int main()
{
	int arr[10] = { 4,3,6,9,1,2,10,8,7,5 };
	
	//数组的长度
	int len = sizeof(arr) / sizeof(arr[0]);
	bubbleSort(arr,len);//数组名就是数组的首地址
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
	system("pause");//按任意键继续

	return 0;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/61359.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LIN总线测试】——LIN主节点数据链路层测试

系列文章目录 &#x1f4d2;【LIN总线测试】——LIN主节点物理层测试 &#x1f4d2;【LIN总线测试】——LIN从节点物理层测试 &#x1f4d2;【LIN总线测试】——LIN主节点数据链路层测试 &#x1f4d2;【LIN总线测试】——LIN主节点网络管理测试 &#x1f4d2;【LIN总线测试】…

Docker consul的容器服务更新与发现

1&#xff09;什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可用性&#xff0c;也不考虑服务的压力承载&#xff0c;服务之间调用单纯的通过接口访问。直到后来出现了多个节点的分布式架构&#xff0c;起初…

一软一硬:记录我的工作电脑两次出现性能问题的分析思路和解决过程

作为一个程序员&#xff0c;每天工作中糟心的事情之一&#xff0c;莫过于自己用来编码的计算机&#xff0c;运行速度忽然变得奇慢无比。尤其像我这种年过四旬仍然在一线从事编码工作的老程序员来说&#xff0c;只有靠不断提高单位时间的产出效率&#xff0c;来弥补和年轻程序员…

网课搜题接口

网课搜题接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&#xff09; 题库…

【leetcode】 盛最多水的容器

一、题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾…

移动通信:数字调制技术(BPSK, DPSK, QPSK, Π/4 QPSK,BFSK, MSK, GMSK, M-ary)学习笔记

文章目录Factors That Influence the Choice of Digital ModulationBandwidth and Power Spectral Density of Digital SignalsPulse Shaping TechniquesGeometric Representation of Modulation SignalsLinear Modulation TechniquesBPSKDifferential Phase Shift Keying (DPS…

软件定义汽车的关键—车载操作系统

文章目录 前言一、车载系统是什么&#xff1f;二、车载系统在智能汽车中的应用总结前言 智能网联大环境变革情况下&#xff0c;软件定义汽车理念已成行业共识。 传统分布式E/E架构因如下原因&#xff1a; 计算能力不足&#xff08;车规芯片&#xff09;&#xff1b;通讯带宽不…

树和二叉树

目录 1.树的概念及结构 1.1树的概念 1.2.树的表示 1.2.1孩子兄弟表示法 2.2双亲表示法 1.3二叉树在实际中的应用 2.二叉树的概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树的实现及其的一些接口&#xff08;链式&#xff09; 2.4.1二叉树的…

配置 4G 模块为WAN口上网

配置 4G 模块为WAN口上网 将Linux板卡配置为交换机&#xff0c;提供类似路由器的上网功能。这里以4G网卡作为WAN进行上网。 1. 配置4G模块为默认网关 先配置好4G模块为默认路由网关。 这里需要先将4G模块配置为路由模式。 断开板卡的有线和无限网络连接&#xff0c;使用pi…

Redis配置与优化

1 关系数据库与非关系型数据库概述 1.1 关系型数据库 一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上 一般面向于记录 SQL 语句&#xff08;标准数据查询语言&#xff09;就是一种基于关系型数据库的语言 用于执行对关系型数据库中…

后渗透之流量转发实验

目录 一、实验项目名称 二、实验目的 三、实验内容 四、实验环境 五、实验步骤 六、实验结果 七、实验总结 一、实验项目名称 后渗透之流量转发实验 二、实验目的 1.掌握ssh进行流量转发的方法 2.掌握proxychains代理软件的使用方法 3.掌握Burpsuite工具的全局代…

Java 基础之锁

Java 基础之线程_禽兽先生不禽兽的博客-CSDN博客 上一篇博客中记录了线程的一些概念&#xff0c;那多线程既然能与人方便必然也会带来一些问题&#xff0c;这些问题主要与线程的三大特性有关&#xff0c;Java 的一些关键字和锁机制&#xff0c;可以帮助我们解决这些问题。 一…

如何高效管理自己的电脑?文件再多也不乱!

视频教程&#xff1a;https://www.bilibili.com/video/BV18M41167jd/?share_sourcecopy_web&vd_source58093f138338062a30d9fe854824a90f 如何高效管理自己的电脑?文件再多也不乱!1. 盘符管理C盘只装系统软件&#xff0c;其他软件装到D盘绿色软件就是解压就能用&#xff…

[go学习笔记.第十八章.数据结构] 1.基本介绍,稀疏数组,队列(数组实现),链表

一.基本介绍 1.数据结构(算法)的介绍 (1).数据结构是一门研究算法的学科&#xff0c;自从有了编程语言也就有了数据结构,学好数据结构可以编写出更加漂亮&#xff0c;更加有效率的代码 (2).要学习好数据结构就要多多考虑如何将生活中遇到的问题用程序去实现解决 (3).程序&…

一 H5游戏的种类

游戏类型&#xff08;各举一个例子&#xff09;&#xff1a; 休闲益智:开心消消乐 角色扮演:阴阳师 动作冒险:神庙逃亡 棋牌游戏:欢乐斗地主 体育竞技:最强NBA 射击游戏:绝地求生 音乐游戏:节奏大师 模拟经营:模拟城市 策略游戏:植物大战僵尸 塔防游戏:保卫萝卜 游戏付费方式…

R语言最优聚类数目k改进kmean聚类算法

在本文中&#xff0c;我们将探讨应用聚类算法&#xff08;例如k均值和期望最大化&#xff09;来确定集群的最佳数量时所遇到的问题之一。 最近我们被客户要求撰写关于聚类的研究报告&#xff0c;包括一些图形和统计输出。从数据集本身来看&#xff0c;确定集群数量的最佳值的问…

FX粒子(Niagara系统)、潮湿贴花——简单雨和雨后潮湿

雨&#xff1a; 1、新建粒子&#xff0c;选择Fountain 喷泉模板 2、删除不用模块 3、添加box location并设置其大小&#xff0c;设置Spawn Rate使粒子数变多&#xff0c;这个参数也是后面用来控制开关雨效果的参数。 4、设置粒子形状&#xff0c;设置完粒子方向不对&#xff0…

11.28~12.4日学习总结

星期一&#xff0c;星期二&#xff1a; 把项目中关于评论模块的内容全部写完了&#xff0c;然后处理了一下逻辑。 星期二&#xff0c;星期三&#xff1a;开始学习webSocket的相关概念。 关于webSocket,其实和java的Socket原理相差不大&#xff0c;也是要建立一个通道进行信息…

JavaScript数据结构【数组】

一、JavaScript中数组一些方法 方法 描述 push 数组的末尾插入元素 unshift 数组的开头插入元素 pop 从数组的末尾删除元素 shift 数组的开头删除元素 splice 在数组的任意位置添加或删除元素 concat 连接两个或更多数组&#xff0c;并返回结果 filter 对数组中…

String类

String类常用的方法 字符串构造 String类的构造方法很多&#xff0c;常见的有以下的三种&#xff1a; //三种常用的构造方法 public class Test {public static void main(String[] args) {//使用常量串构造String s1 "hello world!";//直接new String对象构造St…