谈谈C/C++的指针,数组和可变长数组

下面这些是个人的总结。这些内容C和C++应该是一样的,所以就只说C的了。
如果有不对的地方,欢迎大家指正。

  1. 可以单独定义一个空的指针,但不能单独定义一个空的数组。
    int *a; //合法,&a是a的地址,有意义,a是这个指针指向的地址,未定。如果打印出来可能是0,也可能是其他地址。
    int a[]; //非法。对C和C++都一样。
  2. 在struct或class里面可以光定义一个空指针,不可以光定义空数组。
typedef struct 
{
    int *a;
} A;
//sizeof(A)=8,也就是一个指针的长度。
typedef struct
{
    int b[]; //error: flexible array member in a struct with no named members
} B;

B是非法的。
3. 如果在上面B里面增加一个其他字段(不能是空数组),那么B就是合法的。

typedef struct
{
    int len;
    int b[];
} B;

sizeof(B)=4,也就是int len的长度。这里b[]不占空间,相当于留下一个痕迹。

  1. 通常编译器会把int a[x]当成*(a + x)。这样a[3]和3[a]其实就是一回事。但是因为上面的空数组非法,我们不能认为当x为空时,int a[]等价于*(a)。
  2. 当我们定义int a[3]时,a和&a都表示a的地址,是等价的。但是,当我们定义int *a时,a表示指针a的值,也就是指针a指向什么地址,而&a表示指针a本身的地址。
  3. 后面还有很多,先写这么多吧。

你可能感兴趣的:(C++,c++,c语言,开发语言)