struct可由多个数据类型构成,初步看起来应该类似数组,变量本身是一个指向首字节的指针,无法直接通过此指针赋值struct,在函数中声明为自动变量时,也无法返回此指针所指向的值。
但事实上就并非如此,struct之间可以直接赋值,使用指针指向其地址时需要使用”&”,函数中声明为自动变量时可以直接return其值。
那struct变量本身到底是何?
写了这样一个东西,运行后瞬间明白:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <stdio.h> #include <string.h> struct my_struct { unsigned char ch1; unsigned char ch2; unsigned char ch3; unsigned char ch4; }; int main() { struct my_struct struct1; memset(&struct1, 0, sizeof(struct my_struct)); printf("%u\n", struct1); struct1.ch1 = 0xFF; printf("%u\n", struct1); struct1.ch2 = 0xFF; printf("%u\n", struct1); struct1.ch3 = 0xFF; printf("%u\n", struct1); struct1.ch4 = 0xFF; printf("%u\n", struct1); return 0; } |
struct变量就和基本类型,int, char等一样,直接指向其值,而且struct有多少字节,那个值就有多少字节。
也就是说,我们声明一个struct类型时,就是的的确确等于声明了一个确定大小的类型,就和int, char等基本类型一致。
既然是指向值,有确定大小,而且不是地址,那么就可以解释为何可以直接赋值以及可以被函数return了。
返回数组:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
#include <stdio.h> struct size_struct { int num_array[100]; }; struct size_struct return_a_array(); int main(void) { struct size_struct my_struct; int * const my_array = &my_struct; my_struct = return_a_array(); for (int i = 0; i < 100; i++) printf("%d\n", my_array[i]); return 0; } struct size_struct return_a_array() { struct size_struct my_struct; int * const my_array = &my_struct; for (int i = 0; i < 100; i++) my_array[i] = i; return my_struct; } |