#声明:
1、数组里面只有一个地址和长度
2、数组名不是数组首元素的地址,而数组名里面保存的地址是首元素的地址
关系: *的优先级低于[] *的优先级低于()
数组操作: 1.数组的首地址 2.数组的大小
##区分:
#include<iostream>
using namespace std;
void main()
{
int ar[10]={1,2,3,4,5,6,7,8,9,10};
//三者的地址相同
cout<<&ar[0]<<endl;
cout<<&ar<<endl;
cout<<ar<<endl;
}
#指针数组vs数组指针
指针数组:数组里面保存了指向了某种类型的地址
例如:int *p[10] ; 数组名为P的数组,保存了10个整形的地址
数组指针:指针指向了一个数组
例如:(int *)p[10]; 指针名为p的指针,指向了数组大小为10的数组
数组指针:
#include<iostream>
using namespace std;
void main()
{
int ar[10]={1,2,3,4,5,6,7,8,9,10};
//ar中存放的是数组首元素的地址,首元素是整型,使用int*
int *ptr = ar;
//&ar,ar中存放的是数组元素,因此使用(int*)[10]
int (*pt)[10]=&ar;
}
指针数组
#include<iostream>
using namespace std;
void main(int argc,char *argv[])
{
//char *str[]={"123","afff","ffdfd"};
int a=12;
int b=2;
int c=21;
int *str[3]={&a,&b,&c};
}
#指针函数vs函数指针
函数指针:指针指向了一个函数
#include<iostream>
using namespace std;
int Max(int a,int b)
{ return a>b?a:b;}
//函数指针
int( *pfun)(int ,int );
void main()
{
//Max(10,20);
pfun = &Max;
//pfun = Max(10,20);
(*pfun)(10,20);
}
> (*(void(*)())0)();//相当于一个函数指针
//*( void (*p)() ) (); // *( (void(*)()p) () ;
,相当于把p乔治转换成函数指针类型
指针函数:函数的返回值为指针
char *str(char *Des,const char*Src)
#复杂指针的判断
右左法则:基于[],()的优先级高于*判断,先向右结合遇到括号就反向结合,遇到括号再向右结合(以此递推) ,总往右边看
int *(*(*fun)(int))[10];
一个指针名为fun,指向了一个函数,函数带了一个整型参数,返回值为指针类型,指针指向了一个数组空间大小为10,内容为int *.
解释:
int (*(*fun)(int *)) [5];//fun指针指向了一个函数,该函数带有一个整型指针,且返回值为指针,该指针指向了一个数组大小为5的空间,存放整型数
int (*(*fun(int *))[5];//一个fun函数的参数为整型指针类型且返回值为指针类型,该指针指向了一个数组大小为5的空间,存放整型数
int*(* fun(int*) )[5];//一个fun函数的参数为整型指针类型且返回值为指针类型,该指针指向了一个数组大小为5的空间,存放整型指针类型数
函数:
int func() :int 表示func函数的返回值;
int * func():int * 表示的是func函数的返回值 :指针函数
int (*p) func():表示一个指针指向一个函数 :例如服务端可以定义一个client指针来获取client相关的属性;
int ar1[]:定义一个数组,保存int类型的值;
char* ar2[]:数组中保存为char* 类型的数据,即指针数组;
int (*p) []; 一个指针指向一个数组;数组指针;