1.一维数组传参可写成arr和&arr
#define _CRT_SECURE_NO_WARNINGS 1 #includevoid test11(int arr[]) { int i = 0; for (i = 0; i < 5; i++) { printf("%d ", arr[i]); } printf("n"); } void test12(int* p) //arr表示数组首元素(1x1)地址,因此用指针接收, { p是指针,所以p+i指的是下一个元素(1x1)的地址, int i = 0; *(p + i)可列出所有元素 for (i = 0; i < 5; i++) { printf("%d ", *(p + i)); } printf("n"); } void test2(int(*p)[5]) //&arr表示取整个数组的地址,因此要用指针数组接收, { p是数组指针,所以p+i指的是下一个数组(1x5)的地址,所以不能用 int i = 0; *(p + i),*p表示得到了总个数组,实质是指得到了这个数组 for (i = 0; i < 5; i++) 的第一个元素,而元素是以地址进行存储的,所以*p表示得到了 { 第一个元素(1x1)的地址,*(*p + i)依次能得到所有元素 printf("%d ", *(*(p) + i)); } } int main() { int arr[5] = { 1,2,3,4,5 }; test11(arr); test12(arr); test2(&arr); return 0; }
1.二维数组传参可写成arr和&arr
#includevoid test11(int arr[][3]) { int i = 0; int j = 0; for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { printf("%d ", arr[i][j]); } printf("n"); } printf("n"); } void test12(int(*p)[3]) //arr表示数组首元素(1x3)地址,因此用数组指针接收, { p是数组指针,所以p+i指向下一个数组(1x3)的地址, int i = 0; 所以p+i可用,因为有3行,*(p + i)表示某一行 int j = 0; 首元素(1x1)的地址,所以*(*(p + i)+ j)可列出所有 for (i = 0; i < 3; i++) 元素 { for (j = 0; j < 3; j++) { printf("%d ", *(*(p + i)+ j)); } printf("n"); } printf("n"); } void test2(int(*p)[3][3]) //&arr表示取整个数组(3x3)的地址,因此用数组指针接收, { p是数组指针,p+i表示下一个数组(3x3)的地址,所以p+i int i = 0; 不能用,*p表示数组首元素(1x3)的地址,所以*p + i表示 int j = 0; 下一个数组(1x3)的地址,是可以用的,因为有3行,*(*p + i) for (i = 0; i < 3; i++) +j)表示某一行数组首元素(1x1)的地址,所以*(*(*p + i) + { j))可列出所有元素 for (j = 0; j < 3; j++) { printf("%d ", *(*(*p + i) + j)); } printf("n"); } printf("n"); } int main() { int arr[3][3] = { { 1,2,3 },{4,5,6},{7,8,9} }; test11(arr); test12(arr); test2(&arr); return 0; }
3.一级指针传参可写成p的形式
#includevoid test(int* p) { printf("%dn", *p); } int main() { int a = 5; int* p = &a; test(p); return 0; }
4.二级指针传参可写成&p的形式
#includevoid test(int** pp) { printf("%dn", **pp); } int main() { int a = 5; int* p = &a; int** pp = &p; test(pp); return 0; }
5. 函数指针数组可简化代码
//计算器程序 #includeint Add(int x, int y) { return x + y; } int Sub(int x, int y) { return x - y; } int Mul(int x, int y) { return x * y; } int Div(int x, int y) { return x / y; } void menu() { printf("**************************n"); printf("**** 1.add 2.sub ****n"); printf("**** 3.mul 4.div ****n"); printf("**** 0.exit ****n"); printf("**************************n"); } int main() { int input = 0; int x = 0; int y = 0; int ret = 0; do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: printf("请输入2个操作数:>"); scanf("%d%d", &x, &y); ret = Add(x, y); printf("ret = %dn", ret); break; case 2: printf("请输入2个操作数:>"); scanf("%d%d", &x, &y); ret = Sub(x, y); printf("ret = %dn", ret); break; case 3: printf("请输入2个操作数:>"); scanf("%d%d", &x, &y); ret = Mul(x, y); printf("ret = %dn", ret); break; case 4: printf("请输入2个操作数:>"); scanf("%d%d", &x, &y); ret = Div(x, y); printf("ret = %dn", ret); break; case 0: printf("退出计算器n"); break; default: printf("选择错误n"); break; } } while (input); return 0; }
//计算器程序 #includeint Add(int x, int y) { return x + y; } int Sub(int x, int y) { return x - y; } int Mul(int x, int y) { return x * y; } int Div(int x, int y) { return x / y; } void menu() { printf("**************************n"); printf("**** 1.add 2.sub ****n"); printf("**** 3.mul 4.div ****n"); printf("**** 0.exit ****n"); printf("**************************n"); } int main() { int input = 0; int x = 0; int y = 0; int ret = 0; //转移表 int (*pfArr[])(int, int) = { 0, Add, Sub, Mul, Div }; do { menu(); printf("请选择:>"); scanf("%d", &input); if (input == 0) { printf("退出计算器n"); } else if (input >= 1 && input <= 4) { printf("请输入2个操作数:>"); scanf("%d%d", &x, &y); ret = pfArr[input](x, y); printf("ret = %dn", ret); } else { printf("选择错误n"); } } while (input); return 0; }
6. 函数(Add)中:Add == &Add, *p(1,2) == p(1,2)
#includeint Add(int x, int y) { return (x + y); } int main() { printf("%pn", Add); printf("%pn", &Add); return 0; }
#includeint Add(int x, int y) { return (x + y); } int main() { int(*p)(int, int) = Add; printf("%dn", (*p)(3, 2)); printf("%dn", p(3, 2)); return 0; }
6. 1)一维数组首元素地址就是第1个元素的地址,二维数组首元素地址就是第1行的地址,
2) int(*p)[3][5]这里面的3不能省略,而int arr[3][5]的3可省略,



