9.26 指针类型大全

字符指针:
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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值