一,普通指针的定义
#include<iostream>
using namespace std;
int main()
{
int a=10;
int *p=&a;
cout<<p<<endl;
}
普通指针的定义只需要简单的记录,单个元素的地址,所以在进行声明的时候只需要注意检查指针变量的类型就可以。
二,数组指针的定义和应用
很多人可能疑惑利用下标对数组进行访问不是具有更好的可读性吗?为什么还要用指针进行访问呢,让代码变得复杂,但是在某些情况下利用指针对数组进行操作可以大大提高代码的运行效率。
1.一维数组中的指针使用
数组的地址其实就是数组首个元素的地址
#include<iostream>
using namespace std;
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int *p=arr;
cout<<p<<endl;
int *q=&arr[0];
cout<<q<<endl;
}
0x6ffde0
0x6ffde0
如上面的代码展示的,利用p,q两个指针来打印这个数组的地址,和数组首元素的地址,显示的运行结果是相同的。
注意在利用指针指向数组的时候,记住数组本身就是一个地址,如果定义int *p=&arr那么就会发生错误,因为数组本身就是一个地址。
利用指针访问数组元素
#include<iostream>
using namespace std;
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int *p=arr;
for(int i=0;i<10;i++){
cout<<p+i<<" ";
}
cout<<endl;
for(int i=0;i<10;i++){
cout<<*(p+i)<<" ";
}
}
0x6ffde0 0x6ffde4 0x6ffde8 0x6ffdec 0x6ffdf0 0x6ffdf4 0x6ffdf8 0x6ffdfc 0x6ffe00 0x6ffe04
1 2 3 4 5 6 7 8 9 10
这段代码中进行了两次输出,帮助大家更好的理解*的作用,在一个输出中,直接输出了p+i,而在第二个输出中,则是输出了*(p+i),*是解引用的意思,在这里就可以理解为取指针指向的这个地址的内存中存储的值
#include<iostream>
using namespace std;
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int *p=arr;
for(int i=0;i<10;i++){
cout<<*(arr+i)<<" ";
}
}
包括这样写,是不是对数组名就是一个地址有了更好的理解呢?
一维数组指针的简单应用
求平均值
#include<iostream>
using namespace std;
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int *p=arr;
double sum=0;
for(int i=0;i<10;i++){
sum+=*(p+i);
}
double ave=sum/10;
cout<<ave<<endl;
}
2,二维数组指针的定义和应用
行指针
int (*p)[4] = arr;
其中的括号是用来改变指针的优先级的。这个语句声明了一个指向包含4个整数的数组的指针p。如果没有括号,那么这个语句将会被解释为 int *p[4] = arr; 这样的声明,表示p是一个包含4个指向整数的指针的数组,而不是一个指向包含4个整数的数组的指针。所以括号的作用是改变指针的优先级,确保声明的是一个指向包含4个整数的数组的指针
#include<iostream>
using namespace std;
int main()
{
int arr[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
int (*p)[4]=arr;
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
cout<<*(*(p+i)+j)<<" ";
}
cout<<endl;
}
return 0;
}