目录
本文旨在梳理数组、指针、函数之间的关系,部分基础概念省略。
一、函数
完成特定任务的独立程序代码单元;
函数的定义、调用、声明、参数、返回值;
函数的传参:1.全局传参 2.复制传参(值传递) 3.地址传参(也有可能是指针的值传递)
二、一维数组和指针
数组名和指向数组首地址的指针的区别就是数组名是常量,不能更改,指针是变量,可以更改指向。本质上都是根据地址,操作内存。指针的操作空间为一个元素。
int s[5] = {0};
s[0] = 123;
//注意不能越界
int s1[5] = {1, 2, 3, 4, 5};
int *p = s1;
//s[i] == *(s+i) == *(p+i) == p[i]
三、二维数组和数组指针(行指针)
数组指针的操作空间为一行元素。
int s[3][5] = {0};
s[1][1] = 11;
//列号比较重要
int s2[2][3] = {{1, 2, 3},{4, 5, 6}}
int *q = s2;
//s[i][j] == *(*(s+i)+j) == *(s[i]+j) == p[i][j] == *(*(p+i)+j) == *(p[i]+j)
注意数组指针的降维操作。
四、字符串数组
char s1[5] = {'h','e','l','l','o'};
char s2[32] = "world";
char s3[32] = {'n','i','h','a','o'};
printf("s1 = %s", s1);//输出hello+未知;
printf("s2 = %s", s2);//输出world;
printf("s3 = %s", s3);//输出nihao;一维数组的不完全初始化
五、指针数组
int s[2][5] = {{1,2,3,4,5},{6,7,8,9,0}};
int *p[3] = {NULL};
p[0] = s[0]+3;
p[1] = s[1];
p[2] = s[0];
printf("%d\t%d\n",*p[0], *(p[0]+1));//4 5
printf("%d\t%d\n",*p[1], *(p[1]+1));//6 7
printf("%d\t%d\n",*p[2], *(p[2]+1));//1 2
六、二级指针
二级指针内保存的是一级指针的地址
当需要操作一级指针的指向时可用,例如指针的值传递;
int a = 100;
int b = 200;
int main(){
int *p = &a; //此时指针p指向a
func(&p);
}
void func(int **q){ //将指针p的地址传给函数形参,一级指针的地址要用二级指针保存
*q = &b; //此时二级指针q指向一级指针p,用*q即可更改p的指向
}
七、指针函数
函数的返回值是一个指针;
指针函数返回的地址,在主调函数中必须是有效的;
int *func(int x, int y){
static int temp = 0;
temp = x + y;
return &temp;
}
int main(){
int *p = func(a,b);
printf("%d\n", *p)
}
八、函数指针
通过函数指针来调用函数,函数名代表函数的入口地址;
int func(int x, int y);
int main(){
int a = 100;
int b = 200;
int (*p)(int ,int) = NULL;
p = func;
int s = p(a,b);
return 0;
}
九、函数指针数组
包含若干个函数指针变量的数组;
int func1(int x, int y);
int func2(int x, int y);
int main(){
int a = 100;
int b = 200;
int (*arr[2])(int ,int) = NULL;
arr[0] = func1;
arr[1] = func2;
int s = arr[0](a,b);
int r = arr[1](a,b);
return 0;
}
十、指向函数指针数组的指针
字面意思:指向(函数指针数组)的 (指针)
int func1(int x, int y);
int func2(int x, int y);
int main(){
int a = 100;
int b = 200;
int (*arr[2])(int ,int) = {func1, func2};//定义函数指针数组arr,内有两个函数
int (*(*p))(int, int) = NULL;//定义一个指针指向函数指针数组;
p = arr;
int s = p[0](a,b);
int r = p[1](a,b);
return 0;
}