字符指针:
char arr="abcdefg";
char *p=arr;
printf("%s",arr);
printf("%s",p);
sizeof(数组)在静态内存中计算数组大小,在动态内存中计算指针大小(4/8)
数组名表示首元素地址,在*和静态sizeof表示数组
char *p="abcdef" 和char *p=arr;arr[ ]="abcdef"
两个一样,都是存储首个字符的地址,前者是常量字符串(有些编译器会优化而不报错,比如*p=w,会得到wbcdef)
整形指针数组:
int *p[4]={&a,&b,&c,&d};
指针数组的运用:
int main(){
int arr1[] = { 1,2,3,4,5 };
int arr2[] = { 2,3,4,5,6 };
int arr3[] = { 3,4,5,6,7 } } } };
int* parr[] = {arr1,arr2,arr3 };
int i = 0;
for (i = 0; i < 3; i++)
{
int j = 0;
for (j = 0; j < 5; j++)
printf("%d ", *(parr[i] + j));
}
return 0;
}
数组指针:
int *p=arr; (即p=arr)
一维打印p[1]/*(p+1)/arr[1]/ *(arr+i)
二维打印arr[1][2]/p[1][2]/*(*(p+1)+2)/*(p[1]+2)/(*(p+1))[2]
数组指针运用
void print2(int(*p)[5],int x,int x, int y)
{
int i = 0;
for (i= 0; i<x;i++)
int j = 0;
for (j= 0; j<y;j++)
printf("%d ",*(* (p+i)+j);
printf("\n");
}
int main(){
int arr[3][5] = { { 1,2,3,4,5 }, {2,3,4,5,6},{3,4,5,6,7}}
print2(arr, 3, 5);
return 0;
}
int (*p)[3]=&arr; (3为数组大小)(说人话,就是多解引用一次,*p=arr)
打印方法:*(*p+1)/(*p)[1]
一维数组传参:传数组/指针
函数指针:
int add(int a,int b);
int (*padd)(int,int)=add; //void (*p)(char*)=print
返回类型:padd(1,2)/(*padd)(1,2)/(**padd)(1,2)
函数名和&函数名都是函数的地址
函数指针的设立和返回类型
(*(void(*)( )0)( ) :
void(*)( )函数指针类型,指针为空,接收类型为空,加括号表示强制性转换,使得0变成某函数的地址,0是一个地址,
加一个*取地址上的函数调用,返回类型为空,一句话,这是一句函数调用
void (*signal(int,void(*)(int))) (int):
函数调用,函数名signal,接收类型为整形和函数指针,返回类型为函数指针(这是个返回值类型)
char * my_strcpy(char* dest,const char* src):
char* (*pf) (char*,const char *)=my_strcpy;
chat* (*pfarr[4})(char*,const char*)={my_strcpy};
函数指针的应用
void print(char *str)
{
printf("hehe:%s", str);
}
void test(void (*p)(char*) )
{
printf("test\n");
p("bit");
}
int main()
{
test(print);
return 0;
}
回调函数是用函数指针调用的函数
函数指针数组:
int (*padd[4])(int,int)={add,sub,mul,div};
使用:printf("%d”,padd[0](2,3));
函数指针数组的引用:转移表
实现计算器的简易代码:
#include<stdio.h>
void menu() {
printf("**********************\n");
printf("****1.add 2.sub****\n");
printf("****3.mul 4.div****\n");
printf("****** 0.exit ******\n");
printf("**********************\n");
}
float add(float x, float y) {
return x + y;
}
float sub(float x, float y) {
return x - y;
}
float mul(float x, float y) {
return x * y;
}
float div(float x, float y) {
return x / y;
}
int main() {
menu();
int intput;
while (1) {
printf("请选择运算方式\n");
scanf("%d", &intput);
if (intput>=1&&intput<=4)
{
break;
}
else if (intput==0)
{
exit(0);
}
}
int x, y;
printf("请输入两个数字\n");
scanf("%d %d",&x,&y);
float (*p[4])(float, float) = { add,sub,mul,div };
printf("%f", (*p[intput - 1])(x, y));
}
指向函数指针数组的指针
int (*(*ppfarr)[4])(int,int)/int *ppfarr=(*pfarr)[4]