对于指针的理解

简而言之

指针就是地址!

就是内存中间开辟了一块区域存放数据的地址,这个地址就叫做指针
在这里插入图片描述
指针的定义服从必须的格式:

整型数据:

int *p = &a;

数组:

int *p = arr;

这样就使得p存放了数据的地址(可以理解为p=0x0000)

当涉及到指针与函数的时候

指针与函数

#include<iostream>
using namespace std;

void swap01(int a, int b)
{
	int temp = a;
	a = b;
	b = temp;
	cout << a << endl << b << endl;

}

void swap02(int *p1, int *p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
	// 注意,要记得*p表示解引用
}


int main7()	//注意一个项目中main函数不能重名
{
	//
	int a = 10;
	int b = 20;
	swap01(a, b);
	
	// 函数的值传递,并不改变参数本身,而改变函数体内部的形参
	cout << a << endl << b << endl;

	// 函数的地址传递,&a用int *p1接收,可以修饰实参
	swap02(&a, &b);
	cout << a << endl << b << endl;


	system("pause");

	return 0;

}

swap02(&a, &b); 是传入两个数据的地址,在函数定义的时候,void swap02(int *p1, int *p2) ,得用指针去接,int *p1 则是指针的声明必须遵循的数据格式。**注意,p的解引用与int p无关。

指针与数组

注意,数组的指针很有意思。
int * p= arr;
这样p就存放了arr的首地址,而不需要&。

#include<iostream>
using namespace std;

//冒泡排序函数,大的在后面
void bubbleSort(int *arr, int len)
{
	for (int i = 0; i < len; i++)
	{
		for (int j = 0; j < len-i-1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
			}
		}
	}
}

// 打印数组函数
void printArray(int *arr, int len)
{
	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << endl;
	}
}



int main()	//注意一个项目中main函数不能重名
{
	// 数组创建
	int arr[] = { 3,6,5,7,8,9,5,1 };
	// 获取数组长度
	int len = sizeof(arr) / sizeof(arr[0]);
	//cout << len << endl;
	bubbleSort(arr, len);

	printArray(arr, len);


	system("pause");

	return 0;

}

在定义函数的时候,为了接arr的地址,需要 void bubbleSort(int *arr, int len)
那么在函数定义的程序段中,
arr[1]这种形式可以直接使用,因为函数定义中,括号里面 int *arr 表示arr是个指针,别忘了那句话,

指针就是地址!

那么arr就是存放数组的首地址,那么就可以直接使用arr[1]这种形式访问数组中元素。

new运算符

#include<iostream>
using namespace std;
int *func2()
{
	// 在堆创建整型数据
	// new返回的是 该数据类型的指针
	int * p = new int(10);
	return p;
}

// 1.new的基本语法

void test01()
{
	int *p = func2();
	cout << *p << endl;
	cout << *p << endl;
	// 堆区的数据 由程序员管理开辟,程序员管理释放
	// 如果想释放堆区的数据,利用关键字delete
	delete p;
	//cout << *p << endl;  // 内存已被释放,再次访问就会被视为非法操作,会报错

}

// 2.new在堆区开辟数组
void test02()
{
	// 创建10个整型数据的数组在堆区,[10]表示数组中有十个元素
	int *arr = new int[10];
	for (int i = 0; i < 10; i++)
	{
		arr[i] = i + 100;
	}
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << endl;
	}

	// 如果想释放堆区的数组,利用关键字delete[]
	delete[] arr;
}

int main()	//注意一个项目中main函数不能重名
{


	test01();
	test02();
	system("pause");

	return 0;

}

详细看:

int *func2()
{
	// 在堆创建整型数据
	// new返回的是 该数据类型的指针
	int * p = new int(10);
	return p;
}

这个函数返回了一个指针,也就是一个地址数据。
这个地址由new int开辟于堆区,存放了堆区数据。
下面用
int *p = func2();
来接。因为 int * 是指针声明的必要形式

那么对于数组来说

void test02()
{
	// 创建10个整型数据的数组在堆区,[10]表示数组中有十个元素
	int *arr = new int[10];
	for (int i = 0; i < 10; i++)
	{
		arr[i] = i + 100;
	}
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << endl;
	}

	// 如果想释放堆区的数组,利用关键字delete[]
	delete[] arr;
}

用new int[10]创建了一个堆区十元素数组,并将arr指针指向他,也就是arr存放这个数组的首地址。
那么既然是数组的首地址,自然可以直接arr[1]这种形式直接进行调用数组中的每个元素啦。

最后,要记住

指针就是地址

int *p是声明指针的必要格式,不要与解引用混淆

arr就是数组的首地址,arr[1]就可以访问数组的元素

发布了103 篇原创文章 · 获赞 17 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44684139/article/details/104207721