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   


Leave a Reply

Subscribe to Posts | Subscribe to Comments

- Copyright © Lập trình hệ thống nhúng Linux . Powered by Luong Duy Ninh -