C拾遗

C声明限制

  1. C不支持函数中返回函数
  2. 函数的返回值不能是一个数组,所以像foo()[]这样是非法的。
  3. 数组里面不能有函数,所以像foo()[]这样是非法的。

但下面这样是合法的:

  1. 函数的返回值允许是一个函数指针,例如:int(*func())();
  2. 函数的返回值允许是一个指向数组的指针: 如: int(*foo())[];
  3. 数组里允许有函数指针,如int(*foo[])();
  4. 数组里允许有其他数组,所以你经常看到多维数组: int foo[][];

结构体

  1. int型的变量与之包含一个int型成员的结构体是完全不同的:两者类型就决定有本质区别。 当一个int型形参一般会被传递到寄存器中,而一个结构体在参数传递时很可能会被压入堆栈。
  2. 在结构体中放置数组时,你可以把数组当成第一等类型,可以用赋值语句拷贝整个数组;以传值 方式把它传递到函数,或者,把它当作函数的返回类型,此时,数组隐式转换为指针的规则不再成立。 这在某些场合,可以利用这个技巧使得程序处理起来更加方便。
#include <stdio.h>

struct s_array {
    int array[10];
};


int main(int argc, char** argv)
{
    struct s_array sa1;

    int i = 0;
    for(; i<10; i++){
        sa1.array[i] = i;
    }

    struct s_array sa2;
    sa2 = sa1;

    for(i=0; i<10; i++){
        printf("sa2[%d] = %d\n", i, sa2.array[i]);
    }

    return 0;
}

返回数组指针

int arr[10];
int *p1[10];
int (*p2)[10] = &arr;

Type (*function(parameter_list))[dimension]