【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* p110;

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

相关推荐
MartinYeung514 分钟前
[论文学习]PoisonBench:评估语言模型对投毒偏好数据的脆弱性
人工智能·学习·语言模型
是枚小菜鸡儿吖1 小时前
把视频教程变成可复习的笔记:Docker 部署 BiliNote,自动转写与总结
笔记·docker·容器
运维全栈笔记1 小时前
Vue + Spring Boot 前后端分离项目部署笔记(若依 RuoYi-Vue 3.9.2)
运维·服务器·vue.js·spring boot·笔记·开源·开源软件
豆沙沙包?6 小时前
C++~~~stack容器、queue容器、list容器(p45-P56)
c++·windows·list
Frank_refuel6 小时前
【C++八股】面向对象
开发语言·c++
h_a_o777oah7 小时前
【图论】Tarjan 缩点:解决有向图中环的问题
c++·算法·图论·acm·强连通分量·缩点·tarjan
xian_wwq8 小时前
【学习笔记】-深度认知系列-第1讲-AI不是魔法——三句话讲清楚人工智能到底是什么
笔记·学习·深度认知
M78佐菲8 小时前
c语言学习笔记:排序与查找方法整理
linux·c语言·笔记·学习·算法
别动我齐刘海9 小时前
机器人运动控制学习4——状态估计 State Estimation
c++·人工智能·学习·目标检测·机器学习·机器人·自动驾驶
学习星球9 小时前
OpenHarness 全面配置教学——从游戏开发工作流引入
c++·游戏·ai·ai编程