C语言中的union类型和char *类型

简单回顾一下C语言中的union类型和char *类型。

union类型

有时我们需要在同一块内存空间中视具体情况存储不同数据类型的变量。

例如,我们定义了一个栈,栈的元素可能是char类型也可能是float类型,我们当然可以定义一个StackChar、一个StackFloat来表示这两种不同的栈,然后定义PushChar、PushFloat等等函数,但是这样写就麻烦很多。不如只定义一个SqStack来表示所有的栈,它们共用Push、Pop等函数。SqStack中的元素既可以是char类型也可以是float类型,因此定义为union类型。

union类型的定义:

union [名称]{
    member definition;
    member definition;
    ...
} unionVariable(s);

例如,上面的栈中的元素就可以定义为

typedef union{
    float x;
    char op;
} ElemType;

union成员的访问与struct类似,用成员访问运算符(.)进行。

union类型的变量占用的内存应取其中最大的成员所占的内存。

使用union类型的变量时,可以只写union变量的名称,因为union中只保存了一个变量。

char *类型

char *与char []都用来存储字符串,但char *本质上是一个指向char类型变量的指针,且其中存储的字符串是常量,存储在内存的常量区,不能更改它的值。

例如,语句

char ch='c';
char *a=&ch;

的作用是,定义一个变量a,它是一个指针,指向字符类型的变量ch。之后要想打印a中的内容,仅需

printf("%c\n",*a);

而下面的语句

char str[]="hello";
char *b=str;
char *c=&str[1];
printf("%s\n",b);
printf("%s\n",c);

执行的结果为

hello
ello

char *b=str;即把字符串str(它是一个数组)的起始地址送给了指针b。char *c=&str[1];中,str[1]相当于*(str+1),则&str[1]相当于&(*(str+1))即str+1的地址。

不妨分析一下下面这段代码的输出结果:

char *a="string";
char c='c';
char *b=&c;
char string[]="hello";
char *d=&string[1];
printf("%s\n",a);
printf("%c\n",*b);
printf("%s\n",d);
strcpy(string,"world");
printf("%s\n",d);

答案:

string
c
ello
orld