Linux下c语言函数中:指针参数的传入、指针参数的传出

函数指针参数的传入:int型

#include <stdio.h>
#include <string.h>

void fun(int *p)
{
        *p = 8; //这边(*p)表示传进来的是a的地址,改变(*p)的值,就是改变a的地址里面的值
        printf("函数:p指向:%p, p指向地址中的值: %d,p的地址:%x \n",p,*p,&p);  //这里可以对比主函数p本身地址,和函数p本身的地址是不一样的
        int b = 9;
        p = &b;   //这里是把函数的p指向b的地址,所以无法影响主函数中的p
        printf("函数:p指向:%p, p指向地址中的值: %d,p的地址:%x \n",p,*p,&p);
}

int main(int argc, char* argv[])
{
        int a = 7;
        printf("主函数:a的地址:%x \n",&a);

        int *p = NULL;  //p一开始的地址:adcd4e30
        printf("主函数:p指向:%p, p的地址:%x \n",p,&p);

        p = &a;  //现在p指向a的地址: adcd4e2c
        printf("主函数:p指向:%p, p指向地址中的值: %d,p的地址:%x \n",p,*p,&p);

        fun(p);   //这里是把a的地址传进去: adcd4e2c
        printf("主函数:p指向:%p, p指向地址中的值: %d,p的地址:%x \n",p,*p,&p);
        return 0;
}


结果:

函数指针参数的传入:char型

#include <stdio.h>
#include <string.h>

#define SIZE 32

void fun(char *p)
{
        char b[SIZE] = {0};
        memset(b,0,sizeof(b));
        strcpy(b,p);  //b复制p中地址的值
        printf( "b的值: %s\n",b);
}

int main(int argc, char* argv[])
{
        char a[SIZE] = "hello is me!";

        fun(a);

        return 0;
}

结果:

函数指针参数的传出:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define SIZE 32

void fun(char **p)
{
        char b[SIZE] = "hello is me !";
        strcpy(*p,b);
}

int main(int argc, char* argv[])
{
        char *p = NULL;

        //开辟SZIE大小的空间,来存放函数返回的值
        p = (char *)calloc(1,SIZE);
        if(NULL == p)
        {
                printf("calloc is error \n");
                p = NULL;
        }else{
                fun(&p); //把p的地址传进去,这个地址我们已经开辟了一个空间
                printf("p的值: %s\n", p);
        }

        //用完之后,释放p的空间
        if(NULL != p)
        {
                free(p);
                p = NULL; //p要等于NULL,不然会成为野指针
        }

        return 0;
}

结果:

猜你喜欢

转载自blog.csdn.net/weixin_42432281/article/details/88676446