简而言之
指针就是地址!
就是内存中间开辟了一块区域存放数据的地址,这个地址就叫做指针
指针的定义服从必须的格式:
整型数据:
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]这种形式直接进行调用数组中的每个元素啦。
最后,要记住