我本仁慈,奈何苍天不许
分类: LINUX
2013-11-30 21:14:58
2、结构体
功能:
A、提供一种访问内存的方法
B、对变量提供一种打包功能
C、是C语言实现面向对象的一种方法
面向过程与面向对象的区别:
面向过程:要做什么?该做什么?软件该怎样运行?
面向对象:能做什么? 软件能做什么?
结构体分为有名结构体和无名结构体,无名结构体的好处就是保证它的唯一性,不能被别人使用,但是也可以在前面加typedef也能使用。
有名结构体:
typedef struct aaa{
};
无名结构体:
typedef struct {
}aaa;
可以这样定义一个结构体:
typedef struct aaa AAA;
但是习惯这样定义了:
typedef struct aaa{
}AAA, *AAAP;
AAA a;//<==> struct aaa a;对象的a
AAAP b; //<==>struct aaa* b; 指针的b
结构体的赋值:
①AAA x1 = {1, "hello", 3};
②AAA x2 = {
a:1;
p:"hello";
c:3;
};
③AAA x3 = {
.a = 1;
.p = "hello";
.c = 3;
};
① ②两种赋值方式差不多,但是第②中方式看起来让人更清楚,第③中方式最专业,它是GNU C对结构体的专业初始化,这种赋值的优势就在于:你可以单独对某个变量或者某些变量赋值,但是前面两中方式就不行,必须的一个一个赋值。
下面看一下下面两个定义的结构体:
① typedef struct aaa{
int a;
char *p;
}AAA;
② typedef struct bbb{
int a;
char p[10];
}BBB;
AAA a = {1, “hello”};
BBB b = {1, “hello”};
如下图:
对象a的成员p里面存放的是“hello”的地址,在字符常量区,而对象b中的成员p里面存放的是“hello”的类容,如果对他们进行复制的话,a的复制结果如aa,b的复制结果如bb,aa中的p同样是指向“hello”的地址,而bb中存放的是“hello”的内容,这样a和aa是有一定关联的,但是b与bb是完全独立的,所以有可能a会销毁对象,这样aa就没办法访问“hello”了,尤其是用malloc创建的对象。