指针和数组
数组名是一个指向数组起始元素的常量指针。
p[i]相当于*(p+i)
int main()
{
char str[6]={a,b,c,d,e,f};
char src=0;
src=str[0];//等价于src=*str
src=str[1];//等价于src=*(str+1)
src=str[3];//等价于src=*(str+3)
}
数组名str代表数组本身,类型是char [6] ; 而作为指针,指向第0个元素单元,类型为int *。
1.指针数组:存放指针的数组 (type * name[常量表达式])
int main()
{
char *str[2]={"hello","world"};
char *src="hello";
strcmp(src,*str);
strcmp(src,*(str+1));
}
str是一个指针数组,每个元素单元都是一个指针;而把str当作指针的话,str指向指针数组的第一个元素单元,类型为char **.
2.数组指针:存放数组地址的指针 (type (*name) [常量表达式])
int main()
{
int arr[10];
int (*p)[10]=&arr;//p是一个指向由整型数据组成的数组的指针
char *arr[10];//arr是一个指针数组
char* (*p)[10]=&arr;//*p存放数组的地址
3.指针,数组传参
一维数组传参
int main()
{
int arr[10]={1,3,5,7,9};
int *p[15]={0};
Reverse(arr);
Print(p);
return 0;
}
一级指针传参
当函数的部分参数为一级指针时,函数能接收的参数:一维数组;一级指针;对变量取地址。
int arr[5];----test(arr);
int *p=NULL;----test(p);
int c=5;----test(&c);
二维数组传参
int main()
{
int arr[2][3]={0};
Test(arr);
}
二级指针传参
当函数的部分参数为二级指针时,函数能接收的参数:指针数组;二级指针;对一级指针取地址。
int **p=NULL;---test(p);
int *ptr=NULL;---test(&ptr);
int * arr[16];---test(arr);
指针和函数
函数指针
指向函数的指针变量,包含函数在内存中的地址。(返回值类型 ( * 指针变量名) ([形参列表]);)
void Link(int n,char c);//声明一个函数
void (*p) (int char);//声明一个函数指针
p=Link;//将Link函数的首地址赋给指针p
函数指针数组
函数指针数组是一个其元素是函数指针的数组。
int main()
{
int add(int a, int b);
int sub(int a, int b);
int mul(int a, int b);
int div(int a, int b);
int(*p[4])(int x, int y) = { add, sub, mul, div };
}
函数指针的数组的指针
int main()
{
int(*p[4])(int x, int y) = { add, sub, mul, div };
int (*(*ptr[4]))(int x, int y)=&p;
ptr是一个指针,该指针能够指向一个数组,该数组是一个函数指针的
数组,数组的每一个元素是一个函数指针,该函数指针指向一个参数为int,int,返回类型为int的一个函数。