【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

相关推荐
半生过往2 小时前
前端工程师学习智能体开发(一)
前端·学习·状态模式
susplus2 小时前
【传感器DS18B20】51单片机上实现温度采集
c语言·51单片机·ds18b20·温度采集
xxwxx__2 小时前
C++ STL set 与 map 全套详解:关联式容器、红黑树底层、代码坑点、刷题实战
数据结构·c++
谢白羽3 小时前
MiniMax-H3 : 4卡 H20-3e一套权重部署实践/8卡H200部署优化实测
笔记·llm·论文·大模型部署·sglang
志尊宝3 小时前
Vue3 零基础每日笔记(024):组件的创建与使用——从 import 到自动导入
前端·vue.js·笔记·前端框架·html5
Logic1013 小时前
C语言/数据结构位运算题解:异或XOR找出流水线上的“独特零件编号“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
山下梅子酒2253 小时前
洛谷-入门-B2043
c语言
j7~3 小时前
【Linux网络加餐】(篇六)网络版计算器(上):模板方法模式、序列化与 JSON
linux·c++·json·序列化·反序列化·网络版计算机
weixin_307779133 小时前
C++代码实现MATLAB中的ode45函数功能
开发语言·c++·算法·matlab
张小姐的猫4 小时前
【AI大模型接入SDK】 —— 数据管理 & 与Session模块进行联动
数据结构·数据库·c++·人工智能·python·chatgpt