- Back to Home »
- C »
- C - Structures
Monday, April 27, 2015
1. Struct
Struct là kiểu dữ liệu người dùng tự định nghĩa trong đó là sự kết hợp của nhiều kiểu dữ liệu khác nhau. Khác với union trong một thời điểm chỉ quan tâm đến giá trị của một field, thì trong struct tất cả các field đều phải lưu trữ giá trị có nghĩa. Nói cách khác tất cả các field trong union chia sẻ chung một vùng nhớ, còn các field trong struct nằm ở nhũng vùng nhớ khác nhau, vì thế size của struct bằng tổng size của các field.
Khai báo:
struct [structure tag]
{
member definition;
member definition;
...
member definition;
} [one or more structure variables];
Ex:
struct Person
{
char name[20];
int age;
float height;
};
Truy cập các field:
+ Với biến thường dùng dấu chấm "."
+ Với biến pointer dùng dấu "->"
struct Person presidentUSA;
struct Person *presidentRussia = NULL;
presidentUSA.name
presidentUSA.age
presidentUSA.height
presidentRussia->name
presidentRussia->age
presidentRussia->height
Ex:
struct.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Person
{
char name[20];
int age;
float height;
};
int main()
{
struct Person presidentUSA;
struct Person *presidentRussia = NULL;
printf("sizeof presidentUSA.name: %d \n", sizeof(presidentUSA.name));
printf("sizeof presidentUSA.age: %d \n", sizeof(presidentUSA.age));
printf("sizeof presidentUSA.height: %d \n", sizeof(presidentUSA.height));
printf("sizeof presidentUSA: %d \n", sizeof(presidentUSA));
sprintf(presidentUSA.name, "Obama");
presidentUSA.age = 53;
presidentUSA.height = 1.85f;
printf("\n");
printf("presidentUSA.name = %s \n", presidentUSA.name);
printf("presidentUSA.age = %d \n", presidentUSA.age);
printf("presidentUSA.height = %f \n", presidentUSA.height);
presidentRussia = (struct Person*)malloc(sizeof(struct Person));
if(!presidentRussia) goto _exit;
sprintf(presidentRussia->name, "Putin");
presidentRussia->age = 62;
presidentRussia->height = 1.7f;
printf("\n");
printf("presidentRussia.name = %s \n", presidentRussia->name);
printf("presidentRussia.age = %d \n", presidentRussia->age);
printf("presidentRussia.height = %f \n", presidentRussia->height);
free(presidentRussia);
_exit:
return 0;
}
Compile & Execute:
$ gcc struct.c
$ ./a.out
sizeof presidentUSA.name: 20
sizeof presidentUSA.age: 4
sizeof presidentUSA.height: 4
sizeof presidentUSA: 28
presidentUSA.name = Obama
presidentUSA.age = 53
presidentUSA.height = 1.850000
presidentRussia.name = Putin
presidentRussia.age = 62
presidentRussia.height = 1.700000
2. Struct & Union & Enum
Trong thực tế trong struct không chỉ có các kiểu dữ liệu cơ bản, hơn thế nữa nó là sự kết hợp của nhiều kiểu dữ liệu tự định nghĩa khác như union hay enum.
3. Struct & typedef
Struct kết hợp với typedef tạo ra kiểu dữ liệu mới, đơn giản và nhanh chóng hơn cho việc lập trình:
struct Person presidentUSA;
typedef struct Persion Persion; /* co the giong hoặc khác với tên struct */
Person presidentUSA;
Ex:
struct-typedef.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Person
{
char name[20];
int age;
float height;
}Person;
int main()
{
Person presidentUSA;
sprintf(presidentUSA.name, "Obama");
presidentUSA.age = 53;
presidentUSA.height = 1.85f;
printf("\n");
printf("presidentUSA.name = %s \n", presidentUSA.name);
printf("presidentUSA.age = %d \n", presidentUSA.age);
printf("presidentUSA.height = %f \n", presidentUSA.height);
return 0;
}
4. Struct & Function Pointer
Struct trong C tương tự như Class trong C++, có nghĩa là Struct có thuộc tính và phương thức. Chính vì thế Struct là cấu trúc tạo nên phong cách lập trình hướng đối tượng trong C. Như đã trình bày ở trên các field là các thuộc tính của Struct, vậy làm thế nào để tạo ra được phương phức cho Struct, điều đó đạt được nhờ Function Pointer.
Ex:
struct-opp.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct Person
{
char name[20];
int age;
float height;
void (*intro)(struct Person who);
};
void person_intro(struct Person who){
printf("hello, I'am %s \n", who.name);
printf(" age: %d \n", who.age);
printf(" height: %f \n", who.height);
}
int main()
{
struct Person presidentUSA = {
.name = "Obama",
.age = 53,
.height = 1.85f,
.intro = &person_intro
};
presidentUSA.intro(presidentUSA);
return 0;
}
Compile & Execute:
$ gcc struct-opp.c
$ ./a.out
hello, I'am Obama
age: 53
height: 1.850000