【C/C++】指针

目录

1.指针变量

[1.1 内存和地址](#1.1 内存和地址)

[1.2 指针变量的定义与使用](#1.2 指针变量的定义与使用)

[1.3 指针运算](#1.3 指针运算)

[2. 指针所占用内存空间](#2. 指针所占用内存空间)

3.空指针、野指针

[3.1 空指针](#3.1 空指针)

[3.2 野指针](#3.2 野指针)

4.const修饰指针

[4.1 const修饰指针](#4.1 const修饰指针)

[4.2 const修饰常量](#4.2 const修饰常量)

[4.3 const修饰指针和常量](#4.3 const修饰指针和常量)

5.指针和数组

[5.1 区分指针数组和数组指针](#5.1 区分指针数组和数组指针)

[5.2 利用指针访问数组元素](#5.2 利用指针访问数组元素)

[6. 指针和函数](#6. 指针和函数)

[7. 结构体指针](#7. 结构体指针)


1.指针变量

1.1 内存和地址

指针就是用来访问内存

内存:房间

地址:门牌号

内存单元的编号=地址=指针

1.2 指针变量的定义与使用

指针变量也是一种变量,这种变量是用来存放地址的,存放在指针变量中的值都会理解为地址

(在指针变量的眼里,什么都是地址)

*在说明pa为指针变量,int说明pa指向的对象a是int类型的

如果是字符类型呢?

char ch='w';

char *pc=&ch;

复制代码
#include<iostream>
using namespace std;

int main()
{
	//1. 指针的定义:数据类型* 变量名
	int a = 10;
	int* p;
	//给指针变量赋值
	p = &a;//指针指向a的地址
	cout << p << endl;
	cout << &a << endl;

	//2. 指针的使用
	cout << "* p =" << *p << endl;
	cout << "a = " << a << endl;

	return 0;

}

记住!

p = &a

* p = a

* p = * &a = a,*和&抵消

1.3指针运算

指针类型决定了指针进行+1或-1时,一次走远的距离

int*+1,走4个字节(整形的大小)

char*+1,走1个字节(字符的大小)

void* 无具体类型的指针

不是固定的某一类型的地址,就用void*

2. 指针所占用内存空间

  • 32位平台下地址是32个bit位,指针变量大小是4个字节
  • 64位平台下地址是64个bit位,指针变量大小是8个字节
  • 指针变量的大小和类型是无关的,只要指针类型的变量,在相同的平台下,大小都是相同的

×86:

×64:

复制代码
#include<iostream>
using namespace std;

int main()
{

	cout << sizeof(int*) << endl;
	cout << sizeof(float*) << endl;
	cout << sizeof(double*) << endl;
	cout << sizeof(char*) << endl;

	return 0;
}

3.空指针、野指针

空指针和野指针都不是我们申请的空间,引出不要访问

3.1 空指针

  • 空指针用于给指针变量初始化
  • 空指针是不可以进行访问的

3.2 野指针

4.const修饰指针

实验一下:

复制代码
#include<iostream>
using namespace std;

int main()
{
	int a = 10;
	int b = 20;

	//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;//报错

	return 0;
}

C中const修饰的仍是变量,C++中const修饰的变量是常量

以下三张图中红色为不可修改,黑色为可修改

4.1 const修饰指针

const放在*左边,限制的是:指针指向的内容,不能通过指针来修改指向的内容,但是可以修改指针变量本身的值(修改的指针变量的指向)

4.2 const修饰常量

const放在*右边,限制的是:指针变量本身,指针变量不能再指向其他变量了,但是可以通过修改指针变量修改指针变量指向的内容

4.3 const修饰指针和常量

5.指针和数组

5.1 区分指针数组和数组指针

注意区分指针数组,指针数组是数组,数组指针是指针

字符指针:char*,存放字符的地址

整形指针:int*,存放整形的地址

数组指针:存放数组的地址,指向数组的指针

请思考下面代码的意义?

int* p1[10];

int(*p2)[10];

p1是指针数组,存放指针的数组

p2是指针变量,指向的是数组

5.2 利用指针访问数组元素

访问arr默认就是数组首元素地址

利用for循环逐个访问数组元素

6. 指针和函数

要点:

  • 值传递不会改变实参
  • 地址传递会改变实参

值传递地址传递

复制代码
#include<iostream>
using namespace std;

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;

	return 0;
}

7. 结构体指针

结构体,结构体指针https://blog.csdn.net/2301_76153977/article/details/150353517?spm=1001.2014.3001.5501

相关推荐
xiaotao1316 小时前
02-机器学习基础: 监督学习——线性回归
学习·机器学习·线性回归
BestOrNothing_20156 小时前
C++零基础到工程实战(4.3.3):vector数组访问与遍历
c++·迭代器·stl·vector·动态数组
charlie1145141916 小时前
通用GUI编程技术——图形渲染实战(三十三)——Direct2D与Win32/GDI互操作:渐进迁移实战
c++·图形渲染·gui·win32
文祐7 小时前
C++类之虚函数表及其内存布局(一个子类继承一个父类)
开发语言·c++
墨黎芜7 小时前
ArcGIS从入门到精通——地图符号、注记的初步使用
学习·arcgis·信息可视化
小李云雾7 小时前
FastAPI重要知识点---中间件(Middleware)
学习·程序人生·中间件·fastapi·middleware
.Cnn7 小时前
JavaScript 前端基础笔记(网页交互核心)
前端·javascript·笔记·交互
小夏子_riotous7 小时前
Docker学习路径——3、常用命令
linux·运维·服务器·学习·docker·容器·centos
STLearner8 小时前
WSDM 2026 | 时间序列(Time Series)论文总结【预测,表示学习,因果】
大数据·论文阅读·人工智能·深度学习·学习·机器学习·数据挖掘
redaijufeng8 小时前
网络爬虫学习:应用selenium获取Edge浏览器版本号,自动下载对应版本msedgedriver,确保Edge浏览器顺利打开。
爬虫·学习·selenium