C语言中的“小幽默”(二)

    技术2022-05-19  18

    ps:今天刚把陈正冲老师《C语言深度解剖》看了一边,收获很多,最近一系列关于C语言知识的手记,都是自己调试过得,希望大家也多看看。不过看来还得学一门更高级的语言。C#?or Java?

     

     

     

    逗号表达式

     

    #include <stdio.h>

    int main()

    {

    int a[3][2]={(0,1),(2,3),(4,5)};

    //int a[3][2]={{0,1},{2,3},{4,5}};

    int *p;

    p=a[0];

    printf("%d",p[0]);

    return 0;

    }

    结果是:

    1

    要注意(0,1)之间的‘,’是一个逗号运算符,结果就是取运算符后面的那个值作为逗号运算的结果,所以这个例子结果就是:a[0][0]=1,a[0][1]=3,a[1][0]=5.

     

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    C语言之向函数传递一个数组

     

    我们都知道C/C++语言中的函数都无法把一个数组作为一个实参传递进来,函数接收得只是一个指针。

    当一个一维数组作为函数参数时,编译器总是把它解析成一个指向其首元素地址的指针。但是,这条规则并不是递归的,

    只有一维数组才适用,当数组超过一维以后,将第一维改写成指向元素首地址以后,后面的维就不可在改写了。

    如:

    a[2][3][4]---->(*p)[3][4]

     

    void foo(char a[]);

    void foo(char a[4]);

    对于foo()函数内部来说,两者是没有区别的。

     

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    无法把指针变量本身传递给一个函数

     

    void GetMemory(char *p,int num)

    {

      p=(char *)malloc(num*sizeof(char));

    }

    int main()

    {

       char *str=NULL;

       GetMemory(str);

       strcpy(str,"hello");   //此处是错误,GetMemory获得的仅是str的一个拷贝,而不是其本身

       //要注意,str是局部变量,只不过在main函数中一直存在与内存中

       free(str);  //内存泄漏,str并没有获得一块地址

       return 0;

    }

     

    可行的方式:

    1、return

    void GetMemory(int num)

    {

      char *p

      p=(char *)malloc(num*sizeof(char));

      return p;

    }

    int main()

    {

       char *str=NULL;

       str=GetMemory(6);

       strcpy(str,"hello");

       free(str);

       return 0;

    }

    2、二维指针

    void GetMemory(char **p,int num)

    {

      *p=(char *)malloc(num*sizeof(char));

    }

    int main()

    {

       char *str=NULL;

       GetMemory(&str);  //&str ,到GetMemory()里面*p 相当与*(&str)=str;

       strcpy(str,"hello");

       free(str);

       return 0;

     

    }


    最新回复(0)