int main()
{
char ch = 'w';
char* pc = &ch;
*pc = 'w';
const char* pstr = "hello world.";//这里是把一个字符串放到pstr指针变量里了吗?
printf("%s\n", pstr);
return 0;
}
2.1指针数组
存放指针的数组:
int arr[4];
int* ptr[5];
char* ptr1[5];
3.数组指针
数组指针是指向数组的指针
int (*p)[10];
就是一个数组指针,*号先和p结合,说明他是一个指针指向一个大小为十的数组,每一个元素是整型。所以p是一个数组指针
3.1数组名和&数组名
数组名是数组首元素地址,&数组名是整个数组的地址,但是最初都是指向第一个元素的地址。
?
这里,&arr的类型是? ?int (*) []? ?;是一个数组指针类型
3.2数组指针的使用
void print1(int arr[4][5], int c, int r)
{
int i = 0;
int j = 0;
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
void print2(int(*p)[5], int c, int r)//二维数组可以看作四个一维数组,*p是每一个一维数组的//地址
{
int i = 0;
int j = 0;
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
printf("%d ", p[i][j]);
}
printf("\n");
}
}
int main()
{
int c = 0;
int r = 0;
int arr[4][5]={{1,2,3,3,4},{2,3,2,3,2},{4,6,4,3,2},{4,4,6,3,7}};
int(*ptr)[5] = &arr;
//print1(arr, 5, 4);
print2(arr, 5, 4);
return 0;
}
?从下图可以看出,数组指针加1跳过一个数组的空间
?
4。数组传参和指针传参
void test(int arr[])//ok?
{
printf("ok");
}
void test(int arr[10])//ok?
{}
void test(int* arr)//ok?
{}
void test2(int* arr[20])//ok?
{}
void test2(int** arr)//ok?
{}
int main()
{
int arr[10] = { 0 };
int* arr2[20] = { 0 };
test(arr);
test2(arr2);
return 0;
}
以上一维数组传参都是正确的
二维数组传参
void test3(int arr[3][4])
{}
void test1(int(*a)[4] )
{
printf("%d \n", *(a[1]+1));
}
void test2(int arr[][4]){}
int main()
{
int arr[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
test1(arr);
test2(arr);
return 0;
}
5。函数指针
函数test的地址,加与不加&符号地址都是一样。
同样对函数指针pa,解引用与不解引用,结果都是一样,所以pa(2,3)的pa不用解引用?
?
6.函数指针数组
我们知道指针数组是存放指针的数组
那函数指针数组就是存放函数指针的数组
int (*Pa[4])(int x,int y);
因为Pa[]是数组,int (*) ()z是函数指针类型
例子就是计算器
void print()
{
printf("----------------\n");
printf("--1.add 2.sub--\n");
printf("--3.mul 4.div--\n");
printf("------0.exit----\n");
}
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;
}
int main()
{
int x = 0;
int y = 0;
int input = 0;
print();
printf("请选择->");
int (*pa[5])(int x,int y) = { 0,add,sub,mul,div };
while (scanf("%d", &input) != EOF)
{
if (input >= 1 && input <= 4)
{
printf("请输入两个操作数:");
scanf("%d %d", &x, &y);
printf("%d\n", ( * pa[input])(x, y));
printf("请选择->");
}
else if (0 == input)
{
break;
}
else
printf("输入错误!!\n");
}
return 0;
}
7、指向函数指针数组的指针
int? ?( *(*p[5]) )? (int x,int y)
void test()
{}
void test1()
{}
int main()
{
int (* pa[4])(int x, int y) ;
pa[0] = test;
void (*(*ppa)[1])() = &pa;
printf("%p\n", pa[0]);
printf("%p\n", *ppa[0]);
return 0;
}