1.一维数组传参可写成arr和&arr
#define _CRT_SECURE_NO_WARNINGS 1
#include
void 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+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+i指的是下一个数组(1x5)的地址,
int i = 0; *p表示得到了arr,实质是指得到了这个数组
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
#include
void 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+i指下一个数组arrj[3](1x3)的地址,
int i = 0; 等于&arrj,所以*(p + i)等于arrj,arrj就是数组arrj(1x3)
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+i表示下一个数组(3x3)的地址,
int i = 0; *p表示数组首元素(1x3)的地址,所以*p + i指下一
int j = 0; 个数组arrj[3](1x3)的地址,等于&arrj,*(*p + i)
for (i = 0; i < 3; i++) 等于arrj,表示数组arrj[3](1x3)首元素(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的形式
#include
void test(int* p)
{
printf("%d\n", *p);
}
int main()
{
int a = 5;
int* p = &a;
test(p);
return 0;
}
4.二级指针传参可写成&p的形式
#include
void test(int** pp)
{
printf("%d\n", **pp);
}
int main()
{
int a = 5;
int* p = &a;
int** pp = &p;
test(pp);
return 0;
}
5. 函数指针数组可简化代码
//计算器程序
#include
int 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 = %d\n", ret);
break;
case 2:
printf("请输入2个操作数:>");
scanf("%d%d", &x, &y);
ret = Sub(x, y);
printf("ret = %d\n", ret);
break;
case 3:
printf("请输入2个操作数:>");
scanf("%d%d", &x, &y);
ret = Mul(x, y);
printf("ret = %d\n", ret);
break;
case 4:
printf("请输入2个操作数:>");
scanf("%d%d", &x, &y);
ret = Div(x, y);
printf("ret = %d\n", ret);
break;
case 0:
printf("退出计算器\n");
break;
default:
printf("选择错误\n");
break;
}
} while (input);
return 0;
}
//计算器程序
#include
int 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 = %d\n", ret);
}
else
{
printf("选择错误\n");
}
} while (input);
return 0;
}
6. 函数(Add)中:Add == &Add, *p(1,2) == p(1,2)
#include
int Add(int x, int y)
{
return (x + y);
}
int main()
{
printf("%p\n", Add);
printf("%p\n", &Add);
return 0;
}
#include
int Add(int x, int y)
{
return (x + y);
}
int main()
{
int(*p)(int, int) = Add;
printf("%d\n", (*p)(3, 2));
printf("%d\n", p(3, 2));
return 0;
}
6. 1)一维数组首元素地址就是第1个元素的地址,二维数组首元素地址就是第1行的地址,
2) int(*p)[3][5]这里面的3不能省略,而int arr[3][5]的3可省略,
3) 打印一个字符串只要告诉这个字符串的首地址即可,然后%s打印即可,
4)
char* p1 = "abcdef"; //这里的p1 == p2,指向的都是a
char* p2 = "abcdef";
char* p1[] = "abcdef"; //这里的p1 != p2,这是2个数组里放a,数组不同,地址当然不同
char* p2[] = "abcdef";
5)与地址相关的问题记住下面几句话即可:
1.数组名通常来说是数组首元素的地址
2.但有2个例外,sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小
3.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
4.一维数组首元素的地址指第一个元素的地址,二维数组首元素的地址指第一行的地址
5.理解 int* p = &a 的意思:p == &a,&a是int*类型