指针赋值

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

int getFilelen(int *p)
{
    *p = 40; // p的值是a的地址 *a的地址间接修改a的值
}
//return 只能返回一个结果

int getFilelen2()
{
    int a = 100;
    return a;
}
//形参的属性
int getFilelen3(int b)  //int b 只是具有对外的属性而已,能通过实参传递给形参的方式初始化b
{
    //int b;  写在这儿也可以
    b = 101;
}

//1级指针的技术推演
int main56(void)
{
    int a = 10;
    int *p = NULL;
    
    //修改a的值
    a = 20;  //直接修改

    p = &a;

    *p = 30; //p的值是a的地址 *就像一把钥匙  通过地址 找到一块内存空间  就间接的修改了a的值
    printf("a: %d \n", a);

    getFilelen(&a);
    printf("a: %d \n", a);

    getFilelen2();
    printf("a: %d \n", a);

    getFilelen3(a);
    printf("a: %d \n", a); //a和b没有任何关系
    return 0;
}
void getMem(char **p2)
{
    *p2 = (char *)300;  //间接赋值 p2是p1的地址
}

void getMem5(char *p2)
{
    // char *p2; //写在里面和外面一样,写在外面只是具有对外的属性而已
    p2 = (char *)400;  //间接赋值 p2是p1的地址
}


int main33(void)
{
    char *p1 = NULL;

    char **p2 = NULL;

    p1 = (char *)0x11;
    p2 = (char **)0x22;

    //直接修改p1的值
    p1 = (char *)0x111;

    //间接修改p1的值
    p2 = &p1;

    *p2 = (char *)100;  //间接赋值 p2是p1的地址

    printf("p1:%d \n", p1);

    getMem(&p1);
    printf("p1:%d \n", p1);

    getMem5(p1);  //不会改变p1的值
    printf("p1:%d \n", p1);
    return 0;
}
int getMem3(char **myp1, int *mylen1, char **myp2, int *mylen2)
{
    int        ret = 0;
    char *tmp1, *tmp2;

    tmp1 = (char *)malloc(100);
    strcpy(tmp1, "12345667");

    //间接赋值
    *mylen1 = strlen(tmp1);  //1级指针间接赋值
    *myp1 = tmp1;   //2级指针的间接赋值

    tmp2 = (char *)malloc(200);
    strcpy(tmp2, "aaabbbccc");

    *mylen2 = strlen(tmp2);  //1级指针间接赋值
    *myp2 = tmp2;   //2级指针的间接赋值

    return ret;
}

int main(void)
{
    int        ret =0;
    char    *p1 = NULL;
    int        len1 =0;
    char    *p2 = NULL;
    int        len2 = 0;

    ret = getMem3(&p1, &len1, &p2, &len2);
    if(ret != 0)
    {
        printf("func getMem3() error:%d \n", ret);
        return ret;
    }

    printf("p1: %s \n", p1);
    printf("p2: %s \n", p2);

    if(p1 != NULL)
    {
        free(p1);
        p1 = NULL;
    }

    if(p2 != NULL)
    {
        free(p2);
        p2 = NULL;
    }

    return ret;
}

函数调用时,形参传给实参,用实参取地址,传给形参,在被调用函数里面用*p来改变实参,把运算结果传出来

posted @ 2017-04-08 21:41  Liu_Jing  Views(480)  Comments(1)    收藏  举报