以二维数组为函数参数
A: 形参用数组,实参也用数组;
函数定义:fun(int a[][4])
调用函数:fun(a)
B : 形参用指针,实参用数组;
函数定义 : fun(int(*a)[4])
调用函数:fun(a)
C : 形参用指针,实参用指针;
函数定义 : fun(int(*a)[4])
调用函数:fun(指针a)
//编写一个函数求出二维数组中所有元素的和 #include<stdio.h> int sum(int a[][4]) { int s = 0, i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { s += a[i][j]; } } return s; } int main() { int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; printf("sum=%d", sum(a)); } #include<stdio.h> int sum(int (*a)[4]) { int s = 0, i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { s += a[i][j]; } } return s; } void main() { int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }; printf("sum=%d", sum(a)); } #include<stdio.h> int sum(int(*a)[4]) { int s = 0, i, j; for (i = 0; i < 3; i++) { for (j = 0; j < 4; j++) { s += a[i][j]; } } return s; } int main() { int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 },(*p)[4]=a; printf("sum=%d", sum(p)); }
1)定义一个指针,以后把某个函数的首地址赋给指针,
那么这个指针指向这个函数
定义 :类型标识符(*指针名)(参数类型)
如:int(*p)(int,int);
定义了一个指针p,以后p就只能指向一个函数,并且p以后只能只想一个
返回int值的函数
类型标识符:是用来限制这个指向所指向的函数类型void float int char
参数类型:是用来说明这个指针所指向的函数的参数类型
2)函数名也代表了函数的首地址
3)赋值 float(*p)() = 函数名 or float(*p)();p=函数名;
#include<stdio.h> int max(int a, int b) { if (a > b) return a; return b; } int sum(int a, int b) { return a + b; } float aver(int a, int b, int c) { return (a + b + c) / 3.0; } void main() { float(*p1)(), k3; int(*p)(), k1, k2; //定义了一个指向函数的指针p p = sum;//把sum函数的首地址赋给了指针p,那么就可以通过p来调用sum函数 k1 = p(4, 7); p = max; k2 = p(4, 7); p1 = aver; k3 = p1(1, 4, 7); printf("k1=%d\nk2=%d\nk3=%f", k1, k2, k3);//11 7 4.000000 }
1)什么是指针数组;
a:数组里面的每个元素不是值,而是指针
b : 把很多的指针***在一起,就是一个指针数组
2)定义一个指针数组;
类型标识符 *数组名[长度]
如;int *a[4]
定义了一个数组名a,它里面含有四个元素,
它们分别是a[0], a[1], a[2], a[3], 它们都是一个指针
3)赋值:int a[3] = {1,2,3}.*b[3] = { a,a + 1,a + 2 };
#include<stdio.h> void main() { int a[4] = { 1,2,3,4 }, *b[4] = { a,a + 1,a + 2,a + 3 }; *b[0] = *b[0] + 1; *b[1] = *b[1] + 1; printf("%d,%d,%d", a[0], a[1],**b); } #include<stdio.h> void main() { int a = 1,b = 4, *p[2] = { &a,&b }; **(p + 1) = a * b; *(*p + 1) = a + b;//p[0]+1肯定是指针,这个指针会指向a的下一个单元 printf("a=%d,b=%d\n%d", a, b, (*p + 1)); //1 4 } #include<stdio.h> void main() { char *aa[2] = { "abcd","ABCD" }; printf("%s\n%s", *aa,*(aa+1));//abcd ABCD }
什么是返回指针的函数(指针函数)
1.如果一个函数它的返回值是一个地址(是一个指针的话)
2.返回指针的函数是函数,而不是指针
如何定义返回指针的函数:
类型标识符 *函数名(参数列表)
{
语句体;
}
#include<stdio.h> //不是求更大值,而是求醉大致的地址 int *max(int *a, int *b) //该函数就要返回指针 { if (*a > *b) return a; return b; } void main() { int a = 3, b = 4, *save; save = max(&a, &b); //max的返回值不是值而是指针 printf("%d", *save);//4 } #include<stdio.h> //返回的是数组a中更大元素的地址 int *max(int a[], int n) { int *p = a, i; for (i = 1; i < n; i++) { if (*p < a[i])//值比较 { p = &a[i];//地址赋值 } } return p; } void main() { int a[5] = { 11,22,33,44,55 }; printf("%d", *max(a, 5)); }
让一个函数返回一个字符串
1:字符串是地址
2:让一个函数返回一个字符中,实际上就是让函数返回(地址)一个指针
3:这个函数一定要定义成为返回指针的函数
4:格式:
char *函数名(参数)
{
代码;
}
char *p;
p = "abcd";
5:把char *p中的p不要看成指针,要看成字符串
#include<stdio.h> char *fun(char *p) { p++; while (*p) { *(p - 1) = *p; p++; } p -= 2; return p; } void main() { char str[100] = { "abcde" }, *save; save = fun(str); printf("%s", save); //ee }