目录

1.指针变量

1.1 内存和地址

1.2 指针变量的定义与使用

1.3 指针运算

2. 指针所占用内存空间

3.空指针、野指针

3.1 空指针

3.2 野指针

4.const修饰指针

4.1 const修饰指针

4.2 const修饰常量

4.3 const修饰指针和常量

5.指针和数组

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

5.2 利用指针访问数组元素

6. 指针和函数

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐