02 函数指针与指针运算

Android Ndk 学习笔记(目录)

1 多级指针

void t9(){

    int num = 999 ;
    int * num_p = #
    int ** num_p_p = & num_p;
    int *** num_ppp = & num_p_p;

    printf("num_p 的值 is %d\n",* num_p);
    printf("num_p_p 的值 is %d\n",** num_p_p);
    printf("num_ppp 的值 is %d\n",*** num_ppp);

    printf("num_ppp 的值是一个内存地址 %p   =  num_p_p 的地址  %p \n",num_ppp ,&num_p_p);
    printf("num_p_p 的值是一个内存地址 %p   =  num_p 的地址  %p \n",num_p_p ,&num_p);
    printf("num_p 的值是一个内存地址 %p   =  num 的地址  %p \n",num_p ,&num);
    printf("\n------------------------------------------------\n");
    printf("* num_ppp 的意思是获取他的指向的值 因为  num_ppp 的值是 &num_p_p 所以\n"
           " * num_ppp = *(& num_p_p) = num_p_p = & num_p 的 内存地址 "
           "所以\n "
           "%p = %p =%p =%p \n",* num_ppp ,*(& num_p_p),num_p_p,& num_p);
    printf("\n------------------------------------------------\n");

    printf("\n------------------------------------------------\n");

    printf("** num_ppp 的意思是获取他的 指向 的值 的 指向 的值 \n"
           " ** num_ppp = **(& num_p_p) = *num_p_p = *(& num_p) = num_p = &num  "
           "所以\n "
           "%p = %p =%p = %p = %p = %p\n",** num_ppp ,**(& num_p_p),*num_p_p,*(& num_p),num_p,&num);

    printf("\n------------------------------------------------\n");

    printf("\n------------------------------------------------\n");

    printf("*** num_ppp 的意思是获取他的 指向的值 的 指向的值 的 指向的值 \n"
           " *** num_ppp = ***(& num_p_p) = **num_p_p = **(& num_p) = *num_p = *(&num) = num = 999 "
           "所以\n "
           "%p = %p =%p = %p = %p = %p= %p= %d\n",*** num_ppp ,***(& num_p_p),**num_p_p,**(& num_p),*num_p,*(&num),num,num);

    printf("\n------------------------------------------------\n");

    printf("\n------------------------------------------------\n");

    printf("*** num_ppp 的意思是获取他的 指向的值 的 指向的值 的 指向的值 \n"
           " *** num_ppp = ***(& num_p_p) = **num_p_p = **(& num_p) = *num_p = *(&num) = num = 999 "
           "所以\n "
           "%d = %d =%d = %d = %d = %d= %d= %d\n",*** num_ppp ,***(& num_p_p),**num_p_p,**(& num_p),*num_p,*(&num),num,num);

    printf("\n------------------------------------------------\n");

}

返回结果

E:\C\Project\C01\cmake-build-debug\C01.exe
num_p 的值 is 999
num_p_p 的值 is 999
num_ppp 的值 is 999
num_ppp 的值是一个内存地址 000000000064FDC0   =  num_p_p 的地址  000000000064FDC0
num_p_p 的值是一个内存地址 000000000064FDC8   =  num_p 的地址  000000000064FDC8
num_p 的值是一个内存地址 000000000064FDD4   =  num 的地址  000000000064FDD4

------------------------------------------------
* num_ppp 的意思是获取他的指向的值 因为  num_ppp 的值是 &num_p_p 所以
 * num_ppp = *(& num_p_p) = num_p_p = & num_p 的 内存地址 所以
 000000000064FDC8 = 000000000064FDC8 =000000000064FDC8 =000000000064FDC8

------------------------------------------------

------------------------------------------------
** num_ppp 的意思是获取他的 指向 的值 的 指向 的值
 ** num_ppp = **(& num_p_p) = *num_p_p = *(& num_p) = num_p = &num  所以
 000000000064FDD4 = 000000000064FDD4 =000000000064FDD4 = 000000000064FDD4 = 000000000064FDD4 = 000000000064FDD4

------------------------------------------------

------------------------------------------------
*** num_ppp 的意思是获取他的 指向 的值 的 指向 的值 的 指向 的值
 *** num_ppp = ***(& num_p_p) = **num_p_p = **(& num_p) = *num_p = *(&num) = num = 999 所以
 00000000000003E7 = 00000000000003E7 =00000000000003E7 = 00000000000003E7 = 00000000000003E7 = 00000000000003E7= 0000000
0000003E7= 999

------------------------------------------------

------------------------------------------------
*** num_ppp 的意思是获取他的 指向 的值 的 指向 的值 的 指向 的值
 *** num_ppp = ***(& num_p_p) = **num_p_p = **(& num_p) = *num_p = *(&num) = num = 999 所以
 999 = 999 =999 = 999 = 999 = 999= 999= 999

------------------------------------------------

Process finished with exit code 0

2 数组与数组指针,.采用指针遍历数组。

void t10(){

    int arr[]  = {113,2,23,9} ;

    int i = 0 ;
    for (i; i < 4; ++i) {
       printf("arr[%d] = %d\n",i,arr[i]);
    }

    int * arr_p = arr ;

    int j = 0 ;
    for (j; j < 4; ++j) {
        printf("arr[%d] = %d\n",j,*(arr_p +j));
    }

    printf("arr  %p\n",arr);
    printf("&arr  %p\n",&arr);
    printf("&arr[0]  %p\n",&arr[0]);
    printf("数组 arr 的值 获取的是数组中第一位的地址值\n");
    printf("数组 arr 的值 就是一个地址值 所有 和 &arr 相等\n");
    printf("所以 arr = &arr = &arr[0]\n");
    printf("int * arr_p = arr ;  所以 可以通过arr_p 获取到 数组的值\n");
    printf("* arr_p = %d = arr[0] = %d\n",*arr_p,arr[0]);
    printf("* (arr_p+1) = %d = arr[1] = %d\n",*(arr_p+1),arr[1]);
    printf("* (arr_p+2) = %d = arr[2] = %d\n",*(arr_p+2),arr[2]);
    printf("* (arr_p+3) = %d = arr[3] = %d\n",*(arr_p+3),arr[3]);
    printf("如果 arr_p+=1 后 这每次 都只需在加一即可\n");
    printf("* arr_p = %d = arr[0] = %d\n",*arr_p,arr[0]);
    printf("* (arr_p+=1) = %d = arr[1] = %d\n",*(arr_p+=1),arr[1]);
    printf("* (arr_p+=1) = %d = arr[2] = %d\n",*(arr_p+=1),arr[2]);
    printf("* (arr_p+=1) = %d = arr[3] = %d\n",*(arr_p+=1),arr[3]);

    printf("* (arr_p-=3) = %d = arr[0] = %d\n",*(arr_p-=3),arr[0]);
}

返回结果

E:\C\Project\C01\cmake-build-debug\C01.exe
arr[0] = 113
arr[1] = 2
arr[2] = 23
arr[3] = 9
arr[0] = 113
arr[1] = 2
arr[2] = 23
arr[3] = 9
arr  000000000064FDD0
&arr  000000000064FDD0
&arr[0]  000000000064FDD0
数组 arr 的值 获取的是数组中第一位的地址值
数组 arr 的值 就是一个地址值 所有 和 &arr 相等
所以 arr = &arr = &arr[0]
int * arr_p = arr ;  所以 可以通过arr_p 获取到 数组的值
* arr_p = 113 = arr[0] = 113
* (arr_p+1) = 2 = arr[1] = 2
* (arr_p+2) = 23 = arr[2] = 23
* (arr_p+3) = 9 = arr[3] = 9
如果 arr_p+=1 后 这每次 都只需在加一即可
* arr_p = 113 = arr[0] = 113
* (arr_p+=1) = 2 = arr[1] = 2
* (arr_p+=1) = 23 = arr[2] = 23
* (arr_p+=1) = 9 = arr[3] = 9
* (arr_p-=3) = 113 = arr[0] = 113

Process finished with exit code 0

3 循环时给数组赋值。 数组指针操作的两种方式。

void t11(){

    int arr[5];

    int i = 0 ;
    // (sizeof arr = 4*5 = 20) / (sizeof (int) = 4)  = 5
    for (i = 0; i < sizeof arr / sizeof (int); ++i) {
        arr[i] = 1000+i ;
        printf("arr[%d] = %d\n",i,arr[i]);
    }

    int arrs[5];
    int * arrs_p = arrs ;
    int j = 0 ;
    for (j; j < sizeof arrs / sizeof (int); ++j) {
        * (arrs_p+j) = 1000+j ;
        printf("arrs[%d] = %d\n",j,arrs[j]);
    }

}

返回结果

E:\C\Project\C01\cmake-build-debug\C01.exe
arr[0] = 1000
arr[1] = 1001
arr[2] = 1002
arr[3] = 1003
arr[4] = 1004
arrs[0] = 1000
arrs[1] = 1001
arrs[2] = 1002
arrs[3] = 1003
arrs[4] = 1004

Process finished with exit code 0

4 函数指针

void add(int num1 , int num2){
    printf("num1 + num2 = %d\n",(num1+num2));
}
void mins(int num1 , int num2){
    printf("num1 - num2 = %d\n",(num1-num2));
}
// 操作 回调到  add  mins
// void(*method)(int,int)  声明好 函数指针
// void 返回值
// (*method) 函数名
// (int,int) 两个参数
void opreate12(void(*method)(int,int),int num1,int num2){
    (*method)(num1,num2);
    printf("opreate函数的 method指针是多少:%p\n", method);
}

调用

	opreate12(add,100,20);
    opreate12(mins,100,20);

    // 原理是什么?
    printf("main函数的 add指针是多少:%p\n", add);
    printf("main函数的 mins指针是多少:%p\n", mins);

    // &add和add是一样的值吗
    printf("add 的地址 = %p,  &add 的地址 =  %p\n", add, &add); //  一样的

返回结果

E:\C\Project\C01\cmake-build-debug\C01.exe
num1 + num2 = 120
opreate函数的 method指针是多少:0000000000401F2D
num1 - num2 = 80
opreate函数的 method指针是多少:0000000000401F58
main函数的 add指针是多少:0000000000401F2D
main函数的 mins指针是多少:0000000000401F58
add 的地址 = 0000000000401F2D,  &add 的地址 =  0000000000401F2D

Process finished with exit code 0
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值