【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

相关推荐
earthzhang20213 小时前
【1007】计算(a+b)×c的值
c语言·开发语言·数据结构·算法·青少年编程
江公望3 小时前
Qt QtConcurrent使用入门浅解
c++·qt·qml
迎風吹頭髮3 小时前
UNIX下C语言编程与实践63-UNIX 并发 Socket 编程:非阻塞套接字与轮询模型
java·c语言·unix
我是华为OD~HR~栗栗呀4 小时前
23届考研-Java面经(华为OD)
java·c++·python·华为od·华为·面试
武文斌774 小时前
项目学习总结:LVGL图形参数动态变化、开发板的GDB调试、sqlite3移植、MQTT协议、心跳包
linux·开发语言·网络·arm开发·数据库·嵌入式硬件·学习
爱吃喵的鲤鱼4 小时前
仿mudou——Connection模块(连接管理)
linux·运维·服务器·开发语言·网络·c++
递归不收敛4 小时前
吴恩达机器学习课程(PyTorch适配)学习笔记:1.3 特征工程与模型优化
pytorch·学习·机器学习
郝学胜-神的一滴4 小时前
使用Linux的read和write系统函数操作文件
linux·服务器·开发语言·数据库·c++·程序人生·软件工程
kunge1v54 小时前
学习爬虫第四天:多任务爬虫
爬虫·python·学习·beautifulsoup