41
Con trỏ - Con trỏ - Pointer Pointer

4 Pointer String Struct

  • Upload
    cuong

  • View
    2.218

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 4 Pointer String  Struct

Con trỏ - PointerCon trỏ - Pointer

Page 2: 4 Pointer String  Struct

Con trỏ – PointerCon trỏ – Pointer

Khai báoKhai báo Các toán tử “Các toán tử “&&”, “”, “**”, “=”, “+””, “=”, “+” Nhắc lại về truyền tham số địa chỉNhắc lại về truyền tham số địa chỉ Con trỏ và mảngCon trỏ và mảng Cấp phát vùng nhớ độngCấp phát vùng nhớ động

Page 3: 4 Pointer String  Struct

Con trỏ – Con trỏ – Một số lý do nên sử dụngMột số lý do nên sử dụng

Con trỏ là kiểu dữ liệu lưu trữ địa chỉ của các Con trỏ là kiểu dữ liệu lưu trữ địa chỉ của các vùng dữ liệu trong bộ nhớ máy tínhvùng dữ liệu trong bộ nhớ máy tính

Kiểu con trỏ cho phép:Kiểu con trỏ cho phép: Truyền tham số kiểu địa chỉTruyền tham số kiểu địa chỉ Biểu diễn các kiểu, cấu trúc dữ liệu độngBiểu diễn các kiểu, cấu trúc dữ liệu động Lưu trữ dữ liệu trong vùng nhớ heapLưu trữ dữ liệu trong vùng nhớ heap

Con trỏ đã được sử dụng trong hàm Con trỏ đã được sử dụng trong hàm scanfscanf

Page 4: 4 Pointer String  Struct

Con trỏ – Con trỏ – Khai báo trong CKhai báo trong C

Kiểu con trỏ phải được định nghĩa trên một kiểu cơ sở đã Kiểu con trỏ phải được định nghĩa trên một kiểu cơ sở đã được định nghĩa trước đó.được định nghĩa trước đó.

typedeftypedef kiểucơsởkiểucơsở **Tênkiểu;Tênkiểu;

typedeftypedef intint **PINT;PINT;////PINTPINT là kiểu con trỏ - địa chỉ vùng nhớ kiểu int là kiểu con trỏ - địa chỉ vùng nhớ kiểu int

intint x;x;PINTPINT p;p; //p, p1: biến kiểu //p, p1: biến kiểu int *int *intint *p1;*p1;

Page 5: 4 Pointer String  Struct

int *pi;

long int *p;

float* pf;

char c, d, *pc; /* c và d kiểu char pc là con trỏ đến char */

double* pd, e, f; /* pd là con trỏ đến double e and f are double */

char *start, *end;

int *pi;

long int *p;

float* pf;

char c, d, *pc; /* c và d kiểu char pc là con trỏ đến char */

double* pd, e, f; /* pd là con trỏ đến double e and f are double */

char *start, *end;

Con trỏ – Con trỏ – Khai báo trong CKhai báo trong C

Page 6: 4 Pointer String  Struct

0x91A2

0x1132

Con trỏ - Con trỏ - Toán tử “Toán tử “&&”” ““&&”: toán tử lấy địa chỉ của 1 biến”: toán tử lấy địa chỉ của 1 biến Địa chỉ của tất cả các biến trong chương trình đều đã Địa chỉ của tất cả các biến trong chương trình đều đã

được chỉ định từ khi khai báođược chỉ định từ khi khai báo

char g = 'z';

int main(){

char c = 'a';char *p;p = &c;p = &g;return 0;

}

char g = 'z';

int main(){

char c = 'a';char *p;p = &c;p = &g;return 0;

}

p c'a'

0x1132

p g

'z'0x91A2

Page 7: 4 Pointer String  Struct

““**”: toán tử truy xuất giá trị của vùng nhớ được quản lý ”: toán tử truy xuất giá trị của vùng nhớ được quản lý bởi con trỏ.bởi con trỏ.

#include <stdio.h>char g = 'z';int main(){

char c = 'a';char *p;p = &c;printf("%c\n", *p);p = &g;printf("%c\n", *p);return 0;

}

#include <stdio.h>char g = 'z';int main(){

char c = 'a';char *p;p = &c;printf("%c\n", *p);p = &g;printf("%c\n", *p);return 0;

}

az

az

xuất giá trị do p đang quản lý

Con trỏ - Con trỏ - Toán tử “*”Toán tử “*”

0x91A2

0x1132

p c'a'

0x1132

p g

'z'0x91A2

Page 8: 4 Pointer String  Struct

Con trỏ - Con trỏ - Truyền tham số địa chỉTruyền tham số địa chỉ #include <stdio.h>void change(int *v);

int main(){

int var = 5;change(&var);printf("main: var = %i\n", var);return 0;

}

void change(int *v){

(*v) *= 100;printf("change: *v = %i\n", (*v));

}

#include <stdio.h>void change(int *v);

int main(){

int var = 5;change(&var);printf("main: var = %i\n", var);return 0;

}

void change(int *v){

(*v) *= 100;printf("change: *v = %i\n", (*v));

}

Page 9: 4 Pointer String  Struct

Con trỏ NULLCon trỏ NULL Giá trị đặc biệt để chỉ rằng con trỏ không quản lý vùng Giá trị đặc biệt để chỉ rằng con trỏ không quản lý vùng

nào. Giá trị này thường được dùng để chỉ một con trỏ nào. Giá trị này thường được dùng để chỉ một con trỏ không hợp lệ.không hợp lệ.

#include <stdio.h>int main(){

int i = 13;short *p = NULL;if (p == NULL)

printf(“Con trỏ không hợp lệ!\n");else

printf(“Giá trị : %hi\n", *p);return 0;

}

#include <stdio.h>int main(){

int i = 13;short *p = NULL;if (p == NULL)

printf(“Con trỏ không hợp lệ!\n");else

printf(“Giá trị : %hi\n", *p);return 0;

}

Page 10: 4 Pointer String  Struct

0x15A0

0x15A4

0x15A0

Con trỏ - Con trỏ - Toán tử gán “=”Toán tử gán “=” Có sự khác biệt rất quan trọng khi thực hiện các phép gán:Có sự khác biệt rất quan trọng khi thực hiện các phép gán:

int i = 10, j = 14;int* p = &i;int *q = &j;

*p = *q;

int i = 10, j = 14;int* p = &i;int *q = &j;

*p = *q;

int i = 10, j = 14;int *p = &i;int *q = &j;

p = q;

int i = 10, j = 14;int *p = &i;int *q = &j;

p = q;

và:

p i10

0x15A014

q j

0x15A414

p i10

0x15A0q j

0x15A40x15A4

14

0x15A4

Page 11: 4 Pointer String  Struct

Luyện tập – Luyện tập – Điền vào ô trốngĐiền vào ô trống

int main(void){

int i = 10, j = 14, k;int *p = &i;int *q = &j;

*p += 1;p = &k;*p = *q;p = q;*p = *q;

return 0;}

int main(void){

int i = 10, j = 14, k;int *p = &i;int *q = &j;

*p += 1;p = &k;*p = *q;p = q;*p = *q;

return 0;}

i0x2100

j0x2104

k0x1208

p0x120B

q0x1210

Page 12: 4 Pointer String  Struct

Con trỏ và MảngCon trỏ và Mảng Biến kiểu mảng là địa chỉ tĩnh của một vùng nhớ, được xác Biến kiểu mảng là địa chỉ tĩnh của một vùng nhớ, được xác

định khi khai báo, không thay đổi trong suốt chu kỳ sống.định khi khai báo, không thay đổi trong suốt chu kỳ sống. Biến con trỏ là địa chỉ động của một vùng nhớ, được xác Biến con trỏ là địa chỉ động của một vùng nhớ, được xác

định qua phép gán địa chỉ khi chương trình thực thi.định qua phép gán địa chỉ khi chương trình thực thi.

#include <stdio.h>int main(){

int a[10] = {1, 3, 4, 2, 0};int *p;p = a; //a = p: saiprintf(“0x%04X %i 0x%04X %i\n“, );

a, a[0], p, *p);return 0;

}

#include <stdio.h>int main(){

int a[10] = {1, 3, 4, 2, 0};int *p;p = a; //a = p: saiprintf(“0x%04X %i 0x%04X %i\n“, );

a, a[0], p, *p);return 0;

}

Page 13: 4 Pointer String  Struct

3344

0x15A00x15A00x15A20x15A2

Con trỏ - Con trỏ - Toán tử “+” với số nguyênToán tử “+” với số nguyên

#include <stdio.h>int main(){

short a[10] = {1, 3, 5, 2, 0};short *p = a; printf(“0x%04X %i 0x%04X %i\n“, );

a, a[0], p, *p);p ++;printf(“0x%04X %i 0x%04X %i\n“, );

a, a[0], p, *p);(*p) ++;printf(“0x%04X %i 0x%04X %i\n“, );

a, a[0], p, *p);return 0;

}

#include <stdio.h>int main(){

short a[10] = {1, 3, 5, 2, 0};short *p = a; printf(“0x%04X %i 0x%04X %i\n“, );

a, a[0], p, *p);p ++;printf(“0x%04X %i 0x%04X %i\n“, );

a, a[0], p, *p);(*p) ++;printf(“0x%04X %i 0x%04X %i\n“, );

a, a[0], p, *p);return 0;

}

11

55

22

00

aa

……

0x15A0

pp0x16B2

Page 14: 4 Pointer String  Struct

Con trỏ - Con trỏ - Luyện tậpLuyện tập

#include <stdio.h>int main(){

int a[10] = {2, 3, 5, 1, 4, 7, 0};int *p = a; printf(“%i %i\n“, a[0], *p);p ++;printf(“%i %i\n“, *p, p[2]);p ++; a[2] = 9;printf(“%i %i\n“, p[1], *p);p -= 2;printf(“%i %i\n”, p[3], p[1]);return 0;

}

#include <stdio.h>int main(){

int a[10] = {2, 3, 5, 1, 4, 7, 0};int *p = a; printf(“%i %i\n“, a[0], *p);p ++;printf(“%i %i\n“, *p, p[2]);p ++; a[2] = 9;printf(“%i %i\n“, p[1], *p);p -= 2;printf(“%i %i\n”, p[3], p[1]);return 0;

}

2 23 11 91 3

2 23 11 91 3

Page 15: 4 Pointer String  Struct

Con trỏ - Con trỏ - Cấp phát vùng nhớ độngCấp phát vùng nhớ động

#include <stdio.h>int main(){

int *p = new int[10];p[0] = 1;p[3] = -7;delete []p;return 0;

}

#include <stdio.h>int main(){

int *p = new int[10];p[0] = 1;p[3] = -7;delete []p;return 0;

}

Có thể chỉ định vùng mới cho 1 con trỏ quản lý bằng các Có thể chỉ định vùng mới cho 1 con trỏ quản lý bằng các lệnh hàm lệnh hàm mallocmalloc, , calloccalloc hoặc toán tử hoặc toán tử newnew của C++ của C++

Vùng nhớ do lập trình viên chỉ định phải được giải phóng Vùng nhớ do lập trình viên chỉ định phải được giải phóng bằng lệnh bằng lệnh freefree (malloc, calloc) hoặc toán tử (malloc, calloc) hoặc toán tử deletedelete (new) (new)

Page 16: 4 Pointer String  Struct

Tóm lượcTóm lược

Khai báoKhai báo Các toán tử “Các toán tử “&&”, “”, “**”, “=”, “+””, “=”, “+” Nhắc lại về truyền tham số địa chỉNhắc lại về truyền tham số địa chỉ Con trỏ và mảngCon trỏ và mảng Cấp phát vùng nhớ độngCấp phát vùng nhớ động

Page 17: 4 Pointer String  Struct

Chuỗi ký tự - StringChuỗi ký tự - String

Page 18: 4 Pointer String  Struct

Chuỗi ký tự – StringsChuỗi ký tự – Strings

Một số qui tắcMột số qui tắc Nhập / xuấtNhập / xuất Con trỏ và chuỗi ký tựCon trỏ và chuỗi ký tự Một số hàm thư viện Một số hàm thư viện

Page 19: 4 Pointer String  Struct

Chuỗi ký tự - Chuỗi ký tự - Một số qui tắcMột số qui tắc Chuỗi ký tự là mảng một chiều có mỗi thành phần là một Chuỗi ký tự là mảng một chiều có mỗi thành phần là một

số nguyên được kết thúc bởi số 0.số nguyên được kết thúc bởi số 0. Ký tự kết thúc (0) ở cuối chuỗi ký tự thường được gọi là Ký tự kết thúc (0) ở cuối chuỗi ký tự thường được gọi là

ký tự null (không giống con trỏ NULL). Có thể ghi là 0 ký tự null (không giống con trỏ NULL). Có thể ghi là 0 hoặc ‘\0’ (không phải chữ o).hoặc ‘\0’ (không phải chữ o).

Được khai báo và truyền tham số như mảng một chiều.Được khai báo và truyền tham số như mảng một chiều.

char s[100];unsigned char s1[1000];

char s[100];unsigned char s1[1000];

Page 20: 4 Pointer String  Struct

char first_name[5] = { 'J', 'o', 'h', 'n', '\0' };

char last_name[6] = "Minor";

char other[] = "Tony Blurt";

char characters[7] = "No null";

char first_name[5] = { 'J', 'o', 'h', 'n', '\0' };

char last_name[6] = "Minor";

char other[] = "Tony Blurt";

char characters[7] = "No null";

first_name

last_name

other

characters

Chuỗi ký tự - Chuỗi ký tự - Ví dụVí dụ

'J' 'o' 'h' 'n' 0

'M' 'i' 'n' 'o' 'r' 0

'T' 'o' ‘n’ 'y' 32 'B' 'l' 'u' 'r' 't' 0

'N' 'o' 32 'n' 'u' 'l' 'l' 0

Page 21: 4 Pointer String  Struct

Có thể nhập / xuất chuỗi ký tự s bằng cách nhập từng ký Có thể nhập / xuất chuỗi ký tự s bằng cách nhập từng ký tự của stự của s

Hoặc sử dụng các hàmHoặc sử dụng các hàm scanf scanf và và printfprintf với ký tự định với ký tự định dạng dạng “%s”“%s”

Nhập chuỗi có khoảng trắng dùng hàm getsNhập chuỗi có khoảng trắng dùng hàm gets

char name[100]; printf("Nhap mot chuoi ky tu %s: ");gets(name);

char name[100]; printf("Nhap mot chuoi ky tu %s: ");gets(name);

Chuỗi ký tự - Chuỗi ký tự - Nhập / xuấtNhập / xuất

char other[] = "Tony Blurt"; printf("%s\n", other);

char other[] = "Tony Blurt"; printf("%s\n", other);

Page 22: 4 Pointer String  Struct

Lưu ý: kết thúc chuỗiLưu ý: kết thúc chuỗi#include <stdio.h>

int main(){

char other[] = "Tony Blurt";

printf("%s\n", other);

other[4] = '\0';

printf("%s\n", other);

return 0;}

#include <stdio.h>

int main(){

char other[] = "Tony Blurt";

printf("%s\n", other);

other[4] = '\0';

printf("%s\n", other);

return 0;}

Tony BlurtTony

Tony BlurtTony

other

"Blurt" sẽ không được in ra

'T' 'o' ‘n’ 'y' 32 'B' 'l' 'u' 'r' 't' 0

Page 23: 4 Pointer String  Struct

Chuỗi ký tự – Chuỗi ký tự – Một số hàm thư việnMột số hàm thư viện

Lấy độ dài chuỗiLấy độ dài chuỗi

l = l = strlenstrlen(s);(s); Đổi toàn bộ các ký tự của chuỗi thành IN HOAĐổi toàn bộ các ký tự của chuỗi thành IN HOA

struprstrupr(s);(s); Đổi toàn bộ các ký tự của chuỗi thành Đổi toàn bộ các ký tự của chuỗi thành in thườngin thường

strlwrstrlwr(s);(s);

Page 24: 4 Pointer String  Struct

Chuỗi ký tự – Chuỗi ký tự – Một số hàm thư việnMột số hàm thư viện

So sánh chuỗi: so sánh theo thứ tự từ điểnSo sánh chuỗi: so sánh theo thứ tự từ điển

Phân biệt IN HOA – in thường:Phân biệt IN HOA – in thường:

int int strcmpstrcmp(const char *s1, const char *s2);(const char *s1, const char *s2);

Không phân biệt IN HOA – in thường:Không phân biệt IN HOA – in thường:

int int stricmpstricmp(const char *s1, const char *s2);(const char *s1, const char *s2);

Page 25: 4 Pointer String  Struct

#include <stdio.h>

int main(){

char s1[] = "Minor";char s2[] = "Tony";int cmp = strcmp(s1, s2);if (cmp < 0)

printf("%s < %s", s1, s2);else

if (cmp == 0)printf("%s = %s", s1, s2);

elseprintf("%s > %s", s1, s2);

return 0;}

#include <stdio.h>

int main(){

char s1[] = "Minor";char s2[] = "Tony";int cmp = strcmp(s1, s2);if (cmp < 0)

printf("%s < %s", s1, s2);else

if (cmp == 0)printf("%s = %s", s1, s2);

elseprintf("%s > %s", s1, s2);

return 0;}

Chuỗi ký tự – Chuỗi ký tự – ví dụ ví dụ strcmpstrcmp

Minor < TonyMinor < Tony

Page 26: 4 Pointer String  Struct

Chuỗi ký tự – Chuỗi ký tự – Một số hàm thư việnMột số hàm thư viện

Gán nội dung chuỗi:Gán nội dung chuỗi:o Chép toàn bộ chuỗi source sang chuỗi dest:Chép toàn bộ chuỗi source sang chuỗi dest:

int int strcpystrcpy(char *dest, const char *src);(char *dest, const char *src);

o Chép tối đa n ký tự từ source sang dest:Chép tối đa n ký tự từ source sang dest:

int int strncpystrncpy(char *dest, (char *dest,

const char *src, int n);const char *src, int n);

Tạo chuỗi mới từ chuỗi đã có:Tạo chuỗi mới từ chuỗi đã có:

char *char *strdupstrdup(const char *src);(const char *src);

Page 27: 4 Pointer String  Struct

#include <stdio.h>

int main(){

char s[] = "Tony Blurt";char s2[100], *s3;

strcpy(s2, s);printf("%s\n", s2);strncpy(s2 + 2, "12345", 3);printf("%s\n", s2);s3 = strdup(s + 5);printf("%s\n", s3);free(s3);return 0;

}

#include <stdio.h>

int main(){

char s[] = "Tony Blurt";char s2[100], *s3;

strcpy(s2, s);printf("%s\n", s2);strncpy(s2 + 2, "12345", 3);printf("%s\n", s2);s3 = strdup(s + 5);printf("%s\n", s3);free(s3);return 0;

}

Chuỗi ký tự – Chuỗi ký tự – ví dụ ví dụ strcpystrcpy

Tony Blurt

To123Blurt

Blurt

Tony Blurt

To123Blurt

Blurt

Page 28: 4 Pointer String  Struct

Chuỗi ký tự – Chuỗi ký tự – Một số hàm thư việnMột số hàm thư viện

Nối chuỗi: Nối chuỗi:

char *char *strcatstrcat(char *dest, (char *dest,

const char *src);const char *src);

Tách chuỗi:Tách chuỗi:

char *char *strtokstrtok(char *s, (char *s,

const char *sep);const char *sep);

Trả về địa chỉ của đoạn đầu tiên. Muốn tách đoạn kế tiếp Trả về địa chỉ của đoạn đầu tiên. Muốn tách đoạn kế tiếp tham số thứ nhất sẽ là NULLtham số thứ nhất sẽ là NULL

Page 29: 4 Pointer String  Struct

#include <stdio.h>

#define SEPARATOR "., "

int main(){

char s[]= "Thu strtok: 9,123.45";char *p;

p = strtok(s, SEPARATOR);while (p != NULL) {

printf("%s\n", p);p = strtok(NULL, SEPARATOR);

}return 0;

}

#include <stdio.h>

#define SEPARATOR "., "

int main(){

char s[]= "Thu strtok: 9,123.45";char *p;

p = strtok(s, SEPARATOR);while (p != NULL) {

printf("%s\n", p);p = strtok(NULL, SEPARATOR);

}return 0;

}

Chuỗi ký tự – Chuỗi ký tự – ví dụ ví dụ strtokstrtok

Thu

strtok:

9

123

45

Thu

strtok:

9

123

45

Page 30: 4 Pointer String  Struct

Chuỗi ký tự – Chuỗi ký tự – Một số hàm thư việnMột số hàm thư viện

Tìm một ký tự trên chuỗi: Tìm một ký tự trên chuỗi:

char *char *strchrstrchr(const char *s, int c);(const char *s, int c);

Tìm một đoạn ký tự trên chuỗi: Tìm một đoạn ký tự trên chuỗi:

char *char *strstrstrstr(const char *s1, (const char *s1,

const char *s2);const char *s2);

Page 31: 4 Pointer String  Struct

#include <stdio.h>

int main(){

char s[]= "Thu tim kiem chuoi";char *p;

p = strchr(s, 'm');printf("%s\n", p);p = strstr(s, "em");

printf("%s\n", p);return 0;

}

#include <stdio.h>

int main(){

char s[]= "Thu tim kiem chuoi";char *p;

p = strchr(s, 'm');printf("%s\n", p);p = strstr(s, "em");

printf("%s\n", p);return 0;

}

Chuỗi ký tự – Chuỗi ký tự – ví dụ tìm kiếmví dụ tìm kiếm

m kiem chuoi

em chuoi

m kiem chuoi

em chuoi

Page 32: 4 Pointer String  Struct

#include <stdio.h>

void StrIns(char *s, char *sub){

int len = strlen(sub);memmove(s + len, s, strlen(s)+1);strncpy(s, sub, len);

}int main(){

char s[]= "Thu chen";

StrIns(s, "123"); printf("%s\n", s);StrIns(s + 8, "45"); printf("%s\n", p);return 0;

}

#include <stdio.h>

void StrIns(char *s, char *sub){

int len = strlen(sub);memmove(s + len, s, strlen(s)+1);strncpy(s, sub, len);

}int main(){

char s[]= "Thu chen";

StrIns(s, "123"); printf("%s\n", s);StrIns(s + 8, "45"); printf("%s\n", p);return 0;

}

Chuỗi ký tự – Chuỗi ký tự – chèn một đoạn ký tựchèn một đoạn ký tự

123 Thu chen

123 Thu 45chen

123 Thu chen

123 Thu 45chen

Page 33: 4 Pointer String  Struct

#include <stdio.h>

void StrDel(char *s, int n){

memmove(s, s + n, strlen(s+n)+1);}int main(){

char s[]= "Thu xoa 12345";

StrDel(s, 4); printf("%s\n", s);StrDel(s + 4, 3); printf("%s\n", p);return 0;

}

#include <stdio.h>

void StrDel(char *s, int n){

memmove(s, s + n, strlen(s+n)+1);}int main(){

char s[]= "Thu xoa 12345";

StrDel(s, 4); printf("%s\n", s);StrDel(s + 4, 3); printf("%s\n", p);return 0;

}

Chuỗi ký tự – Chuỗi ký tự – xóa một đoạn ký tựxóa một đoạn ký tự

xoa 12345

xoa 45

xoa 12345

xoa 45

Page 34: 4 Pointer String  Struct

Tóm lượcTóm lược

Khai báoKhai báo Nhập / xuấtNhập / xuất Con trỏ và chuỗi ký tựCon trỏ và chuỗi ký tự Một số hàm thư việnMột số hàm thư viện Chèn / loại bỏ một đoạn conChèn / loại bỏ một đoạn con

Page 35: 4 Pointer String  Struct

Cấu trúc - StructCấu trúc - Struct

Page 36: 4 Pointer String  Struct

Kiểu cấu trúcKiểu cấu trúc

Khái niệmKhái niệm Khai báoKhai báo Truy xuất các thành phầnTruy xuất các thành phần Cấu trúc & mảngCấu trúc & mảng Con trỏ đến cấu trúcCon trỏ đến cấu trúc

Page 37: 4 Pointer String  Struct

Khái niệmKhái niệm

Cấu trúc là kiểu dữ liệu gồm một nhóm các Cấu trúc là kiểu dữ liệu gồm một nhóm các thành phần có kiểu không giống nhau, mỗi thành phần có kiểu không giống nhau, mỗi thành phần được xác định bằng một tên riêng thành phần được xác định bằng một tên riêng biệt.biệt.

Kiểu của mỗi thành phần trong cấu trúclà một Kiểu của mỗi thành phần trong cấu trúclà một kiếu đã được định nghĩa trước, kể cả mảng và kiếu đã được định nghĩa trước, kể cả mảng và các cấu trúc khác.các cấu trúc khác.

Page 38: 4 Pointer String  Struct

Cấu trúc – Cấu trúc – Khai báo trong CKhai báo trong C

Một kiểu cấu trúc được định nghĩa với từ khóa Một kiểu cấu trúc được định nghĩa với từ khóa structstruct..

typedeftypedef structstruct Tênkiểu Tênkiểu

{{

KiểuthànhphầnKiểuthànhphần Tênthànhphần;Tênthànhphần;

KiểuthànhphầnKiểuthànhphần Tênthànhphần;Tênthànhphần;

KiểuthànhphầnKiểuthànhphần Tênthànhphần;Tênthànhphần;

KiểuthànhphầnKiểuthànhphần Tênthànhphần;Tênthànhphần;

......

};};

Page 39: 4 Pointer String  Struct

Cấu trúc – Cấu trúc – ví dụví dụtypedef struct TBook{

char title[80];char author[80];float price;char isbn[20];

};

typedef struct TBook{

char title[80];char author[80];float price;char isbn[20];

};

typedef struct TDate{

char day;char month;int year;

};

typedef struct TDate{

char day;char month;int year;

};

typedef struct TStudent{

char ID[10];char firstname[10];char lastname[20];TDate dob;float marks[10];

};

typedef struct TStudent{

char ID[10];char firstname[10];char lastname[20];TDate dob;float marks[10];

};

//khai báo các biếnTBook book;TStudent list[100];

//khai báo các biếnTBook book;TStudent list[100];

Page 40: 4 Pointer String  Struct

Các thành phần của một biến kiểu cấu trúc được truy xuất Các thành phần của một biến kiểu cấu trúc được truy xuất thông qua tên biến, dấu "." và tên thành phần.thông qua tên biến, dấu "." và tên thành phần.

void Print(TStudent m){

printf("Name : %s %s\n", m.firstname, m.lastname);

printf("Student ID : %s\n", m.ID);printf("Date of birth : %hi/%hi/%i",

m.dob.day, m.dob.month, m.dob.year);printf("Marks : ");for (int i=0; i<10; i++)

printf("%.2f ", m.marks[i]);}

void Print(TStudent m){

printf("Name : %s %s\n", m.firstname, m.lastname);

printf("Student ID : %s\n", m.ID);printf("Date of birth : %hi/%hi/%i",

m.dob.day, m.dob.month, m.dob.year);printf("Marks : ");for (int i=0; i<10; i++)

printf("%.2f ", m.marks[i]);}

Cấu trúc – Cấu trúc – Truy xuất các thành phầnTruy xuất các thành phần

Page 41: 4 Pointer String  Struct

void ReadInfo(TStudent &m){

printf("Type student ID: ");scanf("%s", m.ID);printf("Type first name: ");gets(m.firstname);printf("Type last name: ");gets(m.lastname);printf("Date of birth (d m y): ");scanf("%hi %hi %i", &(m.dob.day),

&(m.dob.month), &(m.dob.year));printf("Marks (10 floats): ");for (int i=0; i<10; i++)

scanf("%f", &(m.marks[i]));}

void ReadInfo(TStudent &m){

printf("Type student ID: ");scanf("%s", m.ID);printf("Type first name: ");gets(m.firstname);printf("Type last name: ");gets(m.lastname);printf("Date of birth (d m y): ");scanf("%hi %hi %i", &(m.dob.day),

&(m.dob.month), &(m.dob.year));printf("Marks (10 floats): ");for (int i=0; i<10; i++)

scanf("%f", &(m.marks[i]));}

Cấu trúc – Cấu trúc – Truy xuất các thành phầnTruy xuất các thành phần