Cách lập trình C hoạt động

Oct 19 2011
Một chương trình máy tính là chìa khóa của thành phố kỹ thuật số: Nếu bạn biết ngôn ngữ, bạn có thể có được một chiếc máy tính để làm hầu hết mọi thứ bạn muốn. Nhận thông tin sốt dẻo về cách hoạt động của C và tại sao nó lại quan trọng như vậy.
Ngôn ngữ lập trình C mang lại cho bạn tính linh hoạt hơn nhiều ngôn ngữ khác, bao gồm khả năng kiểm soát bộ nhớ máy tính của bạn tốt hơn.

Ngôn ngữ lập trình C cực kỳ phổ biến và thật dễ hiểu tại sao. Lập trình bằng C hiệu quả và cung cấp cho người lập trình nhiều quyền kiểm soát. Nhiều ngôn ngữ lập trình khác như C ++, Java và Python được phát triển bằng C.

Cơ hội đang tăng lên mỗi ngày rằng nếu bạn là một lập trình viên, bạn sẽ không sử dụng C riêng cho công việc của mình. Tuy nhiên, có một số việc học C rất có lợi, ngay cả khi bạn không sử dụng nó thường xuyên. Đây là lý do tại sao:

Bạn sẽ có thể đọc và viết mã cho phần mềm có thể được sử dụng trên nhiều loại nền tảng máy tính khác nhau, bao gồm mọi thứ từ vi điều khiển nhỏ đến máy tính để bàn, máy tính xách tay và hệ điều hành di động.

Bạn sẽ hiểu rõ hơn những gì mà các ngôn ngữ cấp cao đang thực hiện đằng sau hậu trường, chẳng hạn như quản lý bộ nhớ và thu gom rác. Sự hiểu biết này có thể giúp bạn viết các chương trình hoạt động hiệu quả hơn.

Nếu bạn là một chuyên gia công nghệ thông tin (CNTT), bạn cũng có thể hưởng lợi từ việc học C. Các chuyên gia CNTT thường viết, duy trì và chạy các tập lệnh như một phần công việc của họ. Tập lệnh là danh sách các hướng dẫn để hệ điều hành của máy tính tuân theo. Để chạy các tập lệnh nhất định, máy tính thiết lập một môi trường thực thi có kiểm soát được gọi là trình bao . Vì hầu hết các hệ điều hành chạy shell dựa trên C, nên C shell là một dạng thích ứng kịch bản phổ biến của C được các chuyên gia IT sử dụng.

Bài viết này trình bày lịch sử đằng sau C, xem xét lý do tại sao C lại quan trọng như vậy, chỉ ra các ví dụ về một số mã C cơ bản và khám phá một số tính năng quan trọng của C, bao gồm kiểu dữ liệu, hoạt động, chức năng, con trỏ và quản lý bộ nhớ. Mặc dù bài viết này không phải là sách hướng dẫn lập trình bằng C, nhưng nó đề cập đến những gì làm cho lập trình C trở nên độc đáo theo cách vượt xa những chương đầu tiên của hướng dẫn lập trình C thông thường.

Hãy bắt đầu bằng cách xem xét ngôn ngữ lập trình C xuất phát từ đâu, nó đã phát triển như thế nào và vai trò của nó trong việc phát triển phần mềm ngày nay.

Nội dung
  1. C là gì?
  2. Chỉnh sửa và biên dịch mã C
  3. Chương trình C đơn giản nhất
  4. Các khái niệm lập trình phổ biến trong C
  5. Các hàm trong C
  6. Nguyên mẫu hàm
  7. Các kiểu dữ liệu và hoạt động trong C
  8. Đừng bắt đầu từ Scratch, hãy sử dụng thư viện
  9. Một số gợi ý về Con trỏ trong C
  10. Sử dụng con trỏ chính xác trong C
  11. Tầm quan trọng của quản lý bộ nhớ trong C

C là gì?

Cách đơn giản nhất để định nghĩa C là gọi nó là một ngôn ngữ lập trình máy tính, nghĩa là bạn có thể viết phần mềm với nó mà máy tính có thể thực thi. Kết quả có thể là một ứng dụng máy tính lớn, như trình duyệt Web của bạn hoặc một bộ hướng dẫn nhỏ được nhúng trong bộ vi xử lý hoặc thành phần máy tính khác.

Ngôn ngữ C được phát triển vào đầu những năm 1970 tại Phòng thí nghiệm Bell, chủ yếu được ghi nhận cho công trình của Ken Thompson và Dennis Ritchie. Các lập trình viên cần một bộ hướng dẫn thân thiện hơn với người dùng cho hệ điều hành UNIX, vào thời điểm đó, hệ điều hành này yêu cầu các chương trình được viết bằng hợp ngữ. Các chương trình hợp ngữ, nói trực tiếp với phần cứng của máy tính, rất dài và khó gỡ lỗi, và chúng đòi hỏi công việc tốn thời gian, tẻ nhạt để thêm các tính năng mới [nguồn: King].

Nỗ lực đầu tiên của Thompson đối với một ngôn ngữ cấp cao được gọi là B, một sự tôn vinh dành cho ngôn ngữ lập trình hệ thống BCPL mà nó dựa trên đó. Khi Bell Labs mua lại mẫu hệ thống UNIX PDP-11 của Công ty Cổ phần Thiết bị Kỹ thuật số (DEC), Thompson đã làm lại B để phù hợp hơn với nhu cầu của phần cứng hệ thống mới hơn, tốt hơn. Như vậy, người kế nhiệm của B là C đã ra đời. Đến năm 1973, C đã đủ ổn định để bản thân UNIX có thể được viết lại bằng cách sử dụng ngôn ngữ cấp cao mới sáng tạo này [nguồn: King].

Trước khi C có thể được sử dụng hiệu quả ngoài Bell Labs, các lập trình viên khác cần một tài liệu giải thích cách sử dụng nó. Năm 1978, cuốn sách "Ngôn ngữ lập trình C" của Brian Kernighan và Dennis Ritchie, được những người đam mê C gọi là K&R hay "Sách trắng", đã trở thành nguồn gốc chính xác cho lập trình C. Kể từ khi viết bài này, ấn bản thứ hai của K&R, được xuất bản lần đầu vào năm 1988, vẫn được phổ biến rộng rãi. Phiên bản gốc, trước tiêu chuẩn của C được gọi là K&R C dựa trên cuốn sách đó.

Để đảm bảo rằng mọi người không tạo ra phương ngữ của riêng họ theo thời gian, các nhà phát triển C đã làm việc trong suốt những năm 1980 để tạo ra các tiêu chuẩn cho ngôn ngữ này. Tiêu chuẩn của Hoa Kỳ cho C, tiêu chuẩn X3.159-1989 của Viện Tiêu chuẩn Quốc gia Hoa Kỳ (ANSI), chính thức trở thành tiêu chuẩn vào năm 1989. Tiêu chuẩn của Tổ chức Tiêu chuẩn Quốc tế (ISO), ISO / IEC 9899: 1990, tiếp nối vào năm 1990. Các phiên bản của C sau khi K&R tham chiếu các tiêu chuẩn này và các bản sửa đổi sau đó của chúng (C89, C90 và C99). Bạn cũng có thể thấy C89 được gọi là "ANSI C", "ANSI / ISO C" hoặc "ISO C."

C và việc sử dụng nó trong UNIX chỉ là một phần của sự bùng nổ phát triển hệ điều hành trong những năm 1980. Tuy nhiên, đối với tất cả những cải tiến của nó so với người tiền nhiệm, C vẫn không dễ dàng sử dụng để phát triển các ứng dụng phần mềm lớn hơn. Khi máy tính trở nên mạnh mẽ hơn, nhu cầu tăng lên để có trải nghiệm lập trình dễ dàng hơn. Nhu cầu này đã thúc đẩy các lập trình viên xây dựng các trình biên dịch của riêng họ, và do đó ngôn ngữ lập trình mới của riêng họ, sử dụng C. Các ngôn ngữ mới này có thể đơn giản hóa việc mã hóa các tác vụ phức tạp với nhiều bộ phận chuyển động. Ví dụ, các ngôn ngữ như C ++ và Java, cả hai đều được phát triển từ C, lập trình hướng đối tượng được đơn giản hóa, một cách tiếp cận lập trình tối ưu hóa khả năng sử dụng lại mã của lập trình viên.

Bây giờ bạn đã biết một chút nền tảng, hãy xem xét cơ chế của C.

Chỉnh sửa và biên dịch mã C

C là ngôn ngữ được biên dịch, có nghĩa là bạn phải sử dụng trình biên dịch để biến mã thành một tệp thực thi trước khi bạn có thể chạy nó. Mã được viết thành một hoặc nhiều tệp văn bản, bạn có thể mở, đọc và chỉnh sửa trong bất kỳ trình soạn thảo văn bản nào, chẳng hạn như Notepad trong Windows, TextEdit trên Mac và gedit trong Linux. Tệp thực thi là thứ mà máy tính có thể chạy (thực thi). Trình biên dịch kiểm tra mã để tìm lỗi và nếu nó có vẻ không có lỗi, sẽ tạo một tệp thực thi.

Trước khi chúng ta xem xét những gì đi vào mã C, hãy chắc chắn rằng chúng ta có thể tìm và sử dụng trình biên dịch C. Nếu bạn đang sử dụng Mac OS X và hầu hết các bản phân phối Linux (chẳng hạn như Ubuntu), bạn có thể thêm trình biên dịch C vào máy tính của mình nếu bạn cài đặt phần mềm công cụ phát triển cho hệ điều hành cụ thể đó. Các trình biên dịch C miễn phí này là các công cụ dòng lệnh, có nghĩa là bạn thường chạy chúng từ dấu nhắc lệnh trong cửa sổ đầu cuối. Lệnh để chạy một trong những trình biên dịch C này là "cc" hoặc "gcc" cộng với một số tùy chọn và đối số dòng lệnh, là những từ khác được nhập sau lệnh trước khi bạn nhấn Enter.

Nếu bạn đang sử dụng Microsoft Windows hoặc bạn muốn sử dụng giao diện người dùng đồ họa hơn là dòng lệnh, bạn có thể cài đặt môi trường phát triển tích hợp (IDE) để lập trình C. IDE là một giao diện duy nhất, nơi bạn có thể viết mã, biên dịch, kiểm tra mã và nhanh chóng tìm và sửa lỗi. Đối với Windows, bạn có thể mua phần mềm Microsoft Visual C ++, một IDE cho cả lập trình C và C ++. Một IDE phổ biến khác là Eclipse, một IDE dựa trên Java miễn phí chạy trên Windows, Mac và Linux và có sẵn các phần mở rộng để biên dịch C và nhiều ngôn ngữ lập trình khác.

Đối với C, cũng như các ngôn ngữ lập trình máy tính khác, phiên bản của trình biên dịch bạn sử dụng là rất quan trọng. Bạn luôn muốn sử dụng phiên bản của trình biên dịch C mới hơn hoặc mới hơn phiên bản của ngôn ngữ C mà bạn đang sử dụng trong chương trình của mình. Nếu bạn đang sử dụng IDE, hãy nhớ điều chỉnh cài đặt của bạn để đảm bảo IDE đang sử dụng phiên bản C mục tiêu của bạn cho chương trình bạn đang làm việc. Nếu bạn đang ở một dòng lệnh, bạn có thể thêm đối số dòng lệnh để thay đổi phiên bản như trong lệnh sau:

gcc –std c99 –o myprogram.exe myprogram.c

Trong lệnh trên, "gcc" là lệnh gọi để chạy trình biên dịch và mọi thứ khác là tùy chọn hoặc đối số dòng lệnh. Tùy chọn "-std" đã được thêm vào, sau đó là "c99" để yêu cầu trình biên dịch sử dụng phiên bản tiêu chuẩn C99 của C trong quá trình biên dịch của nó. Tùy chọn "-o" được thêm vào sau "myprogram.exe" để yêu cầu tệp thực thi, tệp đầu ra của trình biên dịch, được đặt tên là myprogram.exe. Thay vào đó, nếu không có "-o", tệp thực thi sẽ tự động được đặt tên là a.out. Đối số cuối cùng "myprogram.c" cho biết tệp văn bản có mã C sẽ được biên dịch. Tóm lại, lệnh này nói, "Này, gcc, hãy biên dịch myprogram.c bằng tiêu chuẩn lập trình C99 C và đưa kết quả vào một tệp có tên myprogram.exe."Duyệt Web để biết danh sách đầy đủ các tùy chọn mà bạn có thể sử dụng với trình biên dịch cụ thể của mình, cho dù đó là gcc hay thứ gì khác.

Với trình biên dịch của bạn đã được cài đặt, bạn đã sẵn sàng để lập trình trong C. Hãy bắt đầu bằng cách xem cấu trúc cơ bản của một trong những chương trình C đơn giản nhất mà bạn có thể viết.

Chương trình C đơn giản nhất

Chúng ta hãy xem xét một chương trình C đơn giản và sử dụng cả hai để hiểu những điều cơ bản về C và quá trình biên dịch C. Nếu bạn có máy tính của riêng mình với trình biên dịch C được cài đặt như mô tả trước đó, bạn có thể tạo một tệp văn bản có tên là sample.c và sử dụng nó để làm theo trong khi chúng ta xem qua ví dụ này. Lưu ý rằng nếu bạn bỏ đi .c trong tên tệp hoặc nếu trình chỉnh sửa của bạn thêm .txt vào tên, có thể bạn sẽ gặp một số lỗi khi bạn biên dịch nó.

Đây là chương trình mẫu của chúng tôi:

/ * Chương trình mẫu * /

#include

int main ()

{

printf ("Đây là kết quả từ chương trình đầu tiên của tôi! \ n");

trả về 0;

}

Khi được biên dịch và thực thi, chương trình này sẽ hướng dẫn máy tính in ra dòng "Đây là kết quả từ chương trình đầu tiên của tôi!" và sau đó dừng lại. Bạn không thể nhận được nhiều đơn giản hơn thế! Bây giờ chúng ta hãy xem mỗi dòng đang làm gì:

Dòng 1 - Đây là một cách để viết nhận xét bằng C, giữa / * và * / trên một hoặc nhiều dòng.

Dòng 2 - Lệnh #include yêu cầu trình biên dịch xem xét các nguồn khác cho mã C hiện có, đặc biệt là các thư viện, là các tệp bao gồm các hướng dẫn có thể sử dụng lại phổ biến. Các tham chiếu đến một thư viện C tiêu chuẩn với các chức năng để nhận đầu vào từ người dùng và để ghi kết quả ra màn hình. Chúng ta sẽ xem xét các thư viện kỹ hơn ở phần sau.

Dòng 3 - Dòng này là dòng đầu tiên của định nghĩa hàm. Mỗi chương trình C có ít nhất một chức năng hoặc một khối mã đại diện cho một cái gì đó mà máy tính phải làm khi chương trình chạy. Hàm thực hiện nhiệm vụ của nó và sau đó tạo ra một sản phẩm phụ, được gọi là giá trị trả về, có thể được sử dụng bởi các hàm khác. Ở mức tối thiểu, chương trình có một hàm được gọi là main như hàm được hiển thị ở đây với giá trị trả về với kiểu dữ liệu int, có nghĩa là số nguyên. Khi chúng ta kiểm tra các hàm sau này, bạn sẽ thấy ý nghĩa của các dấu ngoặc đơn trống.

Dòng 4 và 7 - Các hướng dẫn trong một hàm được đặt trong dấu ngoặc nhọn. Một số lập trình viên bắt đầu và kết thúc một khối có dấu ngoặc nhọn trên các dòng riêng biệt như được hiển thị ở đây. Những người khác sẽ đặt dấu ngoặc nhọn ({) ở cuối dòng đầu tiên của định nghĩa hàm. Mặc dù các dòng mã trong chương trình không nhất thiết phải được nhập trên các dòng riêng biệt, các lập trình viên thường đặt mỗi lệnh trên một dòng riêng biệt, được thụt lề với khoảng trắng, để làm cho mã dễ đọc và chỉnh sửa sau này.

Dòng 5 - Đây là một lệnh gọi hàm đến một hàm có tên printf. Hàm đó được mã hóa trong thư viện stdio.h bao gồm từ Dòng 1, vì vậy bạn không cần phải tự viết hàm đó. Lệnh gọi printf này cho nó biết những gì cần in ra màn hình. Tuy nhiên, \ n ở cuối, trong dấu ngoặc kép, không được in; nó là một trình tự thoát hướng dẫn printf di chuyển con trỏ đến dòng tiếp theo trên màn hình. Ngoài ra, như bạn có thể thấy, mọi dòng trong hàm phải kết thúc bằng dấu chấm phẩy.

Dòng 6 - Mọi hàm trả về giá trị phải bao gồm một câu lệnh trả về giống như câu lệnh này. Trong C, hàm main phải luôn có kiểu trả về số nguyên, ngay cả khi nó không được sử dụng trong chương trình. Lưu ý rằng khi bạn đang chạy một chương trình C, về cơ bản bạn đang chạy chức năng chính của nó. Vì vậy, khi bạn đang kiểm tra chương trình, bạn có thể yêu cầu máy tính hiển thị giá trị trả về khi chạy chương trình. Giá trị trả về 0 được ưu tiên vì các lập trình viên thường tìm kiếm giá trị đó trong quá trình thử nghiệm để xác nhận chương trình đã chạy thành công.

Khi bạn đã sẵn sàng để kiểm tra chương trình của mình, hãy lưu tệp và biên dịch và chạy chương trình. Nếu bạn đang sử dụng trình biên dịch gcc tại một dòng lệnh và chương trình nằm trong tệp có tên là sample.c, bạn có thể biên dịch nó bằng lệnh sau:

gcc -o sample.exe sample.c

Nếu không có lỗi trong mã, bạn sẽ có một tệp có tên sample.exe trong cùng thư mục với sample.c sau khi chạy lệnh này. Lỗi phổ biến nhất là lỗi cú pháp, nghĩa là bạn đã gõ sai một cái gì đó, chẳng hạn như bỏ dấu chấm phẩy ở cuối dòng hoặc không đóng dấu ngoặc kép hoặc dấu ngoặc đơn. Nếu bạn cần thực hiện thay đổi, hãy mở tệp trong trình soạn thảo văn bản, sửa nó, lưu các thay đổi và thử lại lệnh biên dịch của bạn.

Để chạy chương trình sample.exe, hãy nhập lệnh sau. Lưu ý ./ buộc máy tính nhìn vào thư mục hiện tại để tìm tệp thực thi:

./sample.exe

Đó là những điều cơ bản về mã hóa và biên dịch cho C, mặc dù bạn có thể tìm hiểu thêm về cách biên dịch từ các tài nguyên lập trình C khác. Bây giờ, chúng ta hãy mở hộp và xem C có những gì để xây dựng chương trình.

Các khái niệm lập trình phổ biến trong C

Hãy cùng xem cách đưa một số khái niệm lập trình phổ biến vào thực tế trong mã C của bạn. Sau đây là tóm tắt nhanh về các khái niệm này:

Chức năng - Như đã nói trước đó, một chức năng là một khối mã đại diện cho một cái gì đó mà máy tính phải làm khi chương trình chạy. Một số ngôn ngữ gọi các cấu trúc này là các phương thức, mặc dù các lập trình viên C thường không sử dụng thuật ngữ đó. Chương trình của bạn có thể xác định một số chức năng và gọi các chức năng đó từ các chức năng khác. Sau đó, chúng ta sẽ xem xét kỹ hơn cấu trúc của các hàm trong C.

Các biến - Khi bạn chạy một chương trình, đôi khi bạn cần sự linh hoạt để chạy chương trình mà không cần biết giá trị trước thời hạn là bao nhiêu. Giống như các ngôn ngữ lập trình khác, C cho phép bạn sử dụng các biến khi bạn cần sự linh hoạt đó. Giống như các biến trong đại số, một biến trong lập trình máy tính là một trình giữ chỗ đại diện cho một số giá trị mà bạn chưa biết hoặc chưa tìm thấy.

Kiểu dữ liệu - Để lưu trữ dữ liệu trong bộ nhớ khi chương trình của bạn đang chạy và để biết bạn có thể thực hiện các thao tác nào trên dữ liệu đó, một ngôn ngữ lập trình như C xác định một số kiểu dữ liệu nhất định mà nó sẽ nhận ra. Mỗi kiểu dữ liệu trong C có một kích thước nhất định, được đo bằng bit hoặc byte nhị phân và một bộ quy tắc nhất định về những gì các bit của nó đại diện. Sắp tới, chúng ta sẽ thấy tầm quan trọng của việc chọn loại dữ liệu phù hợp cho tác vụ khi bạn đang sử dụng C.

Các phép toán - Trong C, bạn có thể thực hiện các phép toán số học (chẳng hạn như phép cộng) trên các số và các phép toán chuỗi (chẳng hạn như nối) trên các chuỗi ký tự. C cũng có các hoạt động tích hợp được thiết kế đặc biệt cho những thứ bạn có thể muốn thực hiện với dữ liệu của mình. Khi chúng tôi kiểm tra các kiểu dữ liệu trong C, chúng tôi cũng sẽ xem xét sơ qua các thao tác.

Vòng lặp - Một trong những điều cơ bản nhất mà một lập trình viên sẽ muốn làm là lặp lại một hành động một số lần dựa trên các điều kiện nhất định xuất hiện trong khi chương trình đang chạy. Một khối mã được thiết kế để lặp lại dựa trên các điều kiện đã cho được gọi là vòng lặp và ngôn ngữ C cung cấp các cấu trúc vòng lặp phổ biến này: while, do / while, for, continue / break và goto. C cũng bao gồm các điều kiện if / then / else phổ biến và các câu lệnh switch / case.

Cấu trúc dữ liệu - Khi chương trình của bạn có nhiều dữ liệu cần xử lý và bạn cần sắp xếp hoặc tìm kiếm thông qua dữ liệu đó, có thể bạn sẽ sử dụng một số loại cấu trúc dữ liệu. Cấu trúc dữ liệu là một cách có cấu trúc để biểu diễn một số phần dữ liệu của cùng một kiểu dữ liệu. Cấu trúc dữ liệu phổ biến nhất là một mảng, chỉ là một danh sách được lập chỉ mục có kích thước nhất định. C có sẵn các thư viện để xử lý một số cấu trúc dữ liệu phổ biến, mặc dù bạn luôn có thể viết các hàm và thiết lập cấu trúc của riêng mình.

Hoạt động của bộ tiền xử lý - Đôi khi bạn sẽ muốn cung cấp cho trình biên dịch một số hướng dẫn về những việc cần làm với mã của bạn trước khi biên dịch nó thành tệp thực thi. Các hoạt động này bao gồm việc thay thế các giá trị hằng số và bao gồm mã từ các thư viện C (mà bạn đã thấy trong mã mẫu trước đó).

C cũng yêu cầu người lập trình xử lý một số khái niệm mà nhiều ngôn ngữ lập trình đã đơn giản hóa hoặc tự động hóa. Chúng bao gồm con trỏ, quản lý bộ nhớ và thu gom rác. Các trang sau sẽ trình bày những điều quan trọng cần biết về các khái niệm này khi lập trình bằng C.

Tổng quan nhanh về các khái niệm này có vẻ quá sức nếu bạn chưa phải là một lập trình viên. Trước khi bạn chuyển sang hướng dẫn lập trình C dày đặc, chúng ta hãy xem xét thân thiện với người dùng về các khái niệm cốt lõi trong số những khái niệm được liệt kê ở trên, bắt đầu với các hàm.

Các hàm trong C

Hầu hết các ngôn ngữ lập trình máy tính đều cho phép bạn tạo một số chức năng. Các hàm cho phép bạn chia nhỏ một chương trình dài thành các phần được đặt tên để bạn có thể sử dụng lại các phần đó trong suốt chương trình. Lập trình viên cho một số ngôn ngữ, đặc biệt là những ngôn ngữ sử dụng kỹ thuật lập trình hướng đối tượng, sử dụng thuật ngữ phương thức thay vì hàm .

Các hàm chấp nhận các tham số và trả về một kết quả. Khối mã bao gồm một hàm là định nghĩa hàm của nó. Sau đây là cấu trúc cơ bản của một định nghĩa hàm:

( )

{

trở về ;

}

Tối thiểu, một chương trình C có một chức năng có tên là main. Trình biên dịch sẽ tìm kiếm một hàm chính làm điểm bắt đầu cho chương trình, ngay cả khi hàm chính gọi các hàm khác bên trong nó. Sau đây là phần chính mà chúng ta đã thấy trong chương trình C đơn giản mà chúng ta đã xem xét trước đây. Nó có kiểu trả về là số nguyên, không có tham số và có hai câu lệnh (hướng dẫn trong hàm), một trong số đó là câu lệnh trả về của nó:

int main ()

{

printf ("Đây là kết quả từ chương trình đầu tiên của tôi! \ n");

trả về 0;

}

Các hàm khác với hàm chính có một định nghĩa và một hoặc nhiều lệnh gọi hàm. Lời gọi hàm là một câu lệnh hoặc một phần của câu lệnh trong một hàm khác. Lệnh gọi hàm đặt tên cho hàm mà nó đang gọi, theo sau là dấu ngoặc đơn. Nếu hàm có các tham số thì lệnh gọi hàm phải bao gồm các giá trị tương ứng để khớp với các tham số đó. Phần bổ sung này của lệnh gọi hàm được gọi là truyền các tham số cho hàm.

Nhưng tham số là gì? Tham số cho một hàm là một phần dữ liệu của một kiểu dữ liệu nhất định mà hàm yêu cầu để thực hiện công việc của nó. Các hàm trong C có thể chấp nhận số lượng tham số không giới hạn, đôi khi được gọi là đối số. Mỗi tham số được thêm vào định nghĩa hàm phải xác định hai điều: kiểu dữ liệu và tên biến của nó trong khối hàm. Nhiều tham số được phân tách bằng dấu phẩy. Trong hàm sau, có hai tham số, cả hai đều là số nguyên:

int doubleAndAdd (int a, int b)

{

return ((2 * a) + (2 * b));

}

Tiếp theo, chúng ta hãy tiếp tục xem xét các hàm bằng cách thu nhỏ để xem chúng phù hợp như thế nào trong một chương trình C lớn hơn.

Nguyên mẫu hàm

Trong C, bạn có thể thêm định nghĩa hàm ở bất kỳ đâu trong chương trình (ngoại trừ trong một hàm khác). Điều kiện duy nhất là bạn phải nói trước với trình biên dịch rằng hàm tồn tại ở đâu đó sau này trong mã. Bạn sẽ làm điều này với một nguyên mẫu hàm ở đầu chương trình. Nguyên mẫu là một tuyên bố trông giống với dòng đầu tiên của định nghĩa. Trong C, bạn không phải cung cấp tên của các tham số trong nguyên mẫu, chỉ có các kiểu dữ liệu. Sau đây là nguyên mẫu hàm sẽ trông như thế nào đối với hàm doubleAndAdd:

int doubleAndAdd (int, int);

Hãy tưởng tượng các nguyên mẫu hàm như danh sách đóng gói cho chương trình của bạn. Trình biên dịch sẽ giải nén và lắp ráp chương trình của bạn giống như bạn có thể giải nén và lắp ráp một giá sách mới. Danh sách đóng gói giúp bạn đảm bảo rằng bạn có tất cả các phần bạn cần trong hộp trước khi bắt đầu lắp ráp giá sách. Trình biên dịch sử dụng các nguyên mẫu hàm theo cách tương tự trước khi bắt đầu lắp ráp chương trình của bạn.

Nếu bạn đang theo dõi chương trình sample.c mà chúng ta đã xem trước đó, hãy mở và chỉnh sửa tệp để thêm nguyên mẫu hàm, định nghĩa hàm và lệnh gọi hàm cho hàm doubleAndAdd được hiển thị ở đây. Sau đó, biên dịch và chạy chương trình của bạn như trước để xem mã mới hoạt động như thế nào. Bạn có thể sử dụng mã sau làm hướng dẫn để dùng thử:

#include

int doubleAndAdd (int, int);

int main ()

{

printf ("Đây là kết quả từ chương trình đầu tiên của tôi! \ n");

printf ("Nếu bạn nhân đôi thì thêm 2 và 3, kết quả là:% d \ n", doubleAndAdd (2,3));

trả về 0;

}

int doubleAndAdd (int a, int b)

{

return ((2 * a) + (2 * b));

}

Cho đến nay, chúng ta đã xem xét một số yếu tố cấu trúc cơ bản trong một chương trình C. Bây giờ, chúng ta hãy xem xét các loại dữ liệu bạn có thể làm việc trong chương trình C và những thao tác nào bạn có thể thực hiện trên dữ liệu đó.

Khai báo hàm

Trong C, có thể bạn sẽ nghe thấy thuật ngữ khai báo hàm nhiều hơn là nguyên mẫu hàm, đặc biệt là đối với các lập trình viên C cũ. Tuy nhiên, chúng tôi đang sử dụng thuật ngữ nguyên mẫu hàm trong bài viết này vì nó có một điểm khác biệt quan trọng. Ban đầu, một khai báo hàm không yêu cầu bất kỳ tham số nào, vì vậy kiểu trả về, tên hàm và một cặp dấu ngoặc đơn trống là đủ. Tuy nhiên, một nguyên mẫu hàm cung cấp cho trình biên dịch thông tin bổ sung quan trọng bằng cách bao gồm số lượng và kiểu dữ liệu của các tham số mà nó sẽ gọi. Nguyên mẫu đã trở thành một phương pháp thực hành tốt nhất trong giới lập trình ngày nay, trong C và các ngôn ngữ lập trình khác.

Các kiểu dữ liệu và hoạt động trong C

Theo quan điểm của máy tính, chương trình của bạn chỉ là một chuỗi các số và số không. Các kiểu dữ liệu trong C cho máy tính biết cách sử dụng một số bit đó.

Từ góc độ máy tính của bạn, dữ liệu không là gì khác ngoài một loạt các số và số không đại diện cho trạng thái bật và tắt cho các bit điện tử trên ổ cứng hoặc trong bộ xử lý hoặc bộ nhớ của máy tính. Đó là phần mềm bạn đang chạy trên máy tính xác định cách hiểu hàng tỷ chữ số nhị phân đó. C là một trong số ít ngôn ngữ cấp cao có thể dễ dàng thao tác dữ liệu ở cấp độ bit ngoài việc thông dịch dữ liệu dựa trên một kiểu dữ liệu nhất định.

Kiểu dữ liệu là một tập hợp các quy tắc nhỏ chỉ ra cách hiểu một chuỗi các bit. Kiểu dữ liệu có kích thước cụ thể cộng với cách thực hiện các thao tác riêng của nó (chẳng hạn như cộng và nhân) trên dữ liệu của kiểu đó. Trong C, kích thước của kiểu dữ liệu có liên quan đến bộ xử lý bạn đang sử dụng. Ví dụ, trong C99, một đoạn dữ liệu của kiểu dữ liệu số nguyên (int) dài 16 bit trong bộ xử lý 16 bit trong khi đối với bộ xử lý 32 bit và 64 bit thì dài 32 bit.

Một điều quan trọng khác mà các lập trình viên C cần biết là cách ngôn ngữ này xử lý các kiểu dữ liệu có dấu và không dấu. Kiểu có dấu có nghĩa là một trong các bit của nó được dành riêng làm chỉ báo cho việc đó là số dương hay số âm. Vì vậy, trong khi một số int không dấu trên hệ thống 16 bit có thể xử lý các số từ 0 đến 65,535, một lần đăng nhập trên cùng một hệ thống có thể xử lý các số từ -32,768 đến 32,767. Nếu một thao tác làm cho một biến int vượt ra ngoài phạm vi của nó, thì lập trình viên phải xử lý phần tràn bằng mã bổ sung.

Với những ràng buộc này và các đặc thù của hệ thống cụ thể trong các kiểu dữ liệu và hoạt động C, người lập trình C phải chọn kiểu dữ liệu của họ dựa trên nhu cầu của chương trình của họ. Một số kiểu dữ liệu mà họ có thể chọn là kiểu dữ liệu nguyên thủy trong C, nghĩa là những kiểu dữ liệu được tích hợp sẵn trong ngôn ngữ lập trình C. Hãy xem hướng dẫn lập trình C yêu thích của bạn để biết danh sách đầy đủ các kiểu dữ liệu trong C và thông tin quan trọng về cách chuyển đổi dữ liệu từ kiểu này sang kiểu khác.

Lập trình viên C cũng có thể tạo cấu trúc dữ liệu, kết hợp các kiểu dữ liệu nguyên thủy và một tập hợp các hàm xác định cách dữ liệu có thể được tổ chức và thao tác. Mặc dù việc sử dụng cấu trúc dữ liệu là một chủ đề lập trình nâng cao và nằm ngoài phạm vi của bài viết này, chúng ta sẽ xem xét một trong những cấu trúc phổ biến nhất: mảng. Mảng là một danh sách ảo chứa các phần dữ liệu có cùng kiểu dữ liệu. Không thể thay đổi kích thước của một mảng, mặc dù nội dung của nó có thể được sao chép sang các mảng lớn hơn hoặc nhỏ hơn khác.

Mặc dù các lập trình viên thường sử dụng mảng số, nhưng mảng ký tự, được gọi là chuỗi, có những tính năng độc đáo nhất. Một chuỗi cho phép bạn lưu điều gì đó bạn có thể nói (như "xin chào") thành một chuỗi ký tự mà chương trình C của bạn có thể đọc từ người dùng hoặc in ra trên màn hình. Thao tác với chuỗi có một tập hợp các thao tác độc đáo như vậy, nó có thư viện C dành riêng (string.h) với các hàm chuỗi điển hình của bạn.

Các hoạt động tích hợp trong C là các hoạt động điển hình mà bạn tìm thấy trong hầu hết các ngôn ngữ lập trình. Khi bạn đang kết hợp một số phép toán vào một câu lệnh, hãy đảm bảo biết mức độ ưu tiên của toán tử hoặc thứ tự mà chương trình sẽ thực hiện mỗi phép toán trong một biểu thức toán học. Ví dụ, (2 + 5) * 3 bằng 21 trong khi 2 + 5 * 3 bằng 17, vì C sẽ thực hiện phép nhân trước khi cộng trừ khi có dấu ngoặc cho biết khác.

Nếu bạn đang học C, hãy ưu tiên làm quen với tất cả các kiểu dữ liệu và phép toán nguyên thủy của nó và mức độ ưu tiên cho các phép toán trong cùng một biểu thức. Ngoài ra, hãy thử nghiệm với các hoạt động khác nhau trên các biến và số lượng của các kiểu dữ liệu khác nhau.

Tại thời điểm này, bạn đã làm xước bề mặt của một số điều cơ bản C quan trọng. Tuy nhiên, tiếp theo, hãy xem cách C cho phép bạn viết các chương trình mà không cần bắt đầu lại từ đầu.

Đừng bắt đầu từ Scratch, hãy sử dụng thư viện

Thư viện rất quan trọng trong C vì ngôn ngữ C chỉ hỗ trợ những tính năng cơ bản nhất mà nó cần. Ví dụ: C không chứa các hàm nhập - xuất (I / O) để đọc từ bàn phím và ghi ra màn hình. Bất cứ điều gì mở rộng hơn những điều cơ bản phải được viết bởi một lập trình viên. Nếu đoạn mã hữu ích cho nhiều chương trình khác nhau, nó thường được đưa vào thư viện để có thể dễ dàng sử dụng lại.

Trong cuộc thảo luận của chúng tôi về C cho đến nay, chúng tôi đã thấy một thư viện, thư viện I / O (stdio) tiêu chuẩn. Dòng #include ở đầu chương trình hướng dẫn trình biên dịch C tải thư viện từ tệp tiêu đề có tên stdio.h. Trình duy trì C bao gồm các thư viện C tiêu chuẩn cho I / O, các hàm toán học, thao tác thời gian và các hoạt động phổ biến trên cấu trúc dữ liệu nhất định, chẳng hạn như một chuỗi ký tự. Tìm kiếm trên Web hoặc hướng dẫn lập trình C yêu thích của bạn để biết thông tin về thư viện chuẩn C89 và các cập nhật và bổ sung trong C99.

Bạn cũng có thể viết thư viện C. Bằng cách đó, bạn có thể chia chương trình của mình thành các mô-đun có thể sử dụng lại. Cách tiếp cận mô-đun này không chỉ giúp dễ dàng đưa cùng một mã vào nhiều chương trình mà còn tạo ra các tệp chương trình ngắn hơn, dễ đọc, kiểm tra và gỡ lỗi hơn.

Để sử dụng các chức năng trong tệp tiêu đề, hãy thêm dòng #include cho tệp đó ở đầu chương trình của bạn. Đối với các thư viện chuẩn, hãy đặt tên của tệp tiêu đề tương ứng của thư viện giữa các dấu lớn hơn và nhỏ hơn (). Đối với các thư viện bạn tự tạo, hãy đặt tên của tệp giữa dấu ngoặc kép. Không giống như các câu lệnh trong các phần khác của chương trình C, bạn không phải đặt dấu chấm phẩy ở cuối mỗi dòng. Phần sau cho thấy bao gồm một trong từng loại thư viện:

#include

#include "mylib.h"

Một nguồn lập trình C toàn diện phải cung cấp các hướng dẫn bạn cần để viết các thư viện của riêng mình trong C. Các định nghĩa hàm bạn sẽ viết không khác nhau cho dù chúng nằm trong thư viện hay trong chương trình chính của bạn. Sự khác biệt là bạn sẽ biên dịch chúng một cách riêng biệt trong một cái gì đó được gọi là tệp đối tượng (có tên kết thúc bằng .o) và bạn sẽ tạo tệp thứ hai, được gọi là tệp tiêu đề (với tên kết thúc bằng .h) chứa các nguyên mẫu hàm tương ứng với từng hàm trong thư viện. Đó là tệp tiêu đề mà bạn sẽ tham chiếu trong dòng #include trong mỗi chương trình chính sử dụng thư viện của bạn và bạn sẽ bao gồm tệp đối tượng làm đối số trong lệnh trình biên dịch mỗi khi bạn biên dịch chương trình đó.

Các tính năng C mà chúng tôi đã khám phá cho đến nay cũng là điển hình trong các ngôn ngữ lập trình khác. Tuy nhiên, tiếp theo, chúng ta sẽ nói về cách C quản lý bộ nhớ máy tính của bạn.

Một số gợi ý về Con trỏ trong C

Khi chương trình C của bạn được tải vào bộ nhớ (thường là bộ nhớ truy cập ngẫu nhiên, hoặc RAM, trong máy tính của bạn), mỗi phần của chương trình được liên kết với một địa chỉ trong bộ nhớ. Điều này bao gồm các biến bạn đang sử dụng để lưu giữ một số dữ liệu nhất định. Mỗi khi chương trình của bạn gọi một hàm, nó sẽ tải hàm đó và tất cả dữ liệu liên quan của nó vào bộ nhớ chỉ đủ lâu để chạy hàm đó và trả về một giá trị. Nếu bạn chuyển các tham số cho hàm, C sẽ tự động tạo một bản sao của giá trị để sử dụng trong hàm.

Tuy nhiên, đôi khi khi bạn chạy một chức năng, bạn muốn thực hiện một số thay đổi vĩnh viễn đối với dữ liệu tại vị trí bộ nhớ ban đầu của nó. Nếu C tạo một bản sao dữ liệu để sử dụng trong hàm, dữ liệu gốc vẫn không thay đổi. Nếu bạn muốn thay đổi dữ liệu gốc đó, bạn phải truyền một con trỏ đến địa chỉ bộ nhớ của nó (truyền theo tham chiếu) thay vì truyền giá trị của nó cho hàm (truyền theo giá trị).

Con trỏ được sử dụng ở khắp mọi nơi trong C, vì vậy nếu bạn muốn sử dụng ngôn ngữ C một cách đầy đủ, bạn phải hiểu rõ về con trỏ. Con trỏ là một biến giống như các biến khác, nhưng mục đích của nó là lưu địa chỉ bộ nhớ của một số dữ liệu khác. Con trỏ cũng có kiểu dữ liệu để nó biết cách nhận ra các bit tại địa chỉ bộ nhớ đó.

Khi bạn nhìn hai biến cạnh nhau trong mã C, bạn có thể không phải lúc nào cũng nhận ra con trỏ. Đây có thể là một thách thức đối với ngay cả những lập trình viên C kinh nghiệm nhất. Tuy nhiên, khi bạn lần đầu tiên tạo một con trỏ, nó rõ ràng hơn vì phải có dấu hoa thị ngay trước tên biến. Đây được gọi là toán tử điều hướng trong C. Đoạn mã ví dụ sau tạo một số nguyên i và một con trỏ tới một số nguyên p:

int i;

int * p;

Hiện tại không có giá trị nào được gán cho i hoặc p. Tiếp theo, hãy gán một giá trị cho i và sau đó gán p để trỏ đến địa chỉ của i.

i = 3;

p = & i;

Tại đây, bạn có thể thấy dấu và (&) được sử dụng làm toán tử địa chỉ ngay trước i, có nghĩa là "địa chỉ của i." Bạn không cần phải biết địa chỉ đó là gì để thực hiện nhiệm vụ. Điều đó tốt, bởi vì nó có thể sẽ khác nhau mỗi khi bạn chạy chương trình! Thay vào đó, toán tử địa chỉ sẽ xác định địa chỉ được liên kết với biến đó trong khi chương trình đang chạy. Nếu không có toán tử địa chỉ, phép gán p = i sẽ gán cho p địa chỉ bộ nhớ của 3, theo nghĩa đen, chứ không phải là địa chỉ bộ nhớ của biến i.

Tiếp theo, hãy xem cách bạn có thể sử dụng con trỏ trong mã C và những thách thức bạn muốn chuẩn bị.

Sử dụng con trỏ chính xác trong C

Nếu bạn muốn trở nên thành thạo trong lập trình C, bạn sẽ cần nắm chắc cách sử dụng hiệu quả các con trỏ trong mã của mình.

Khi bạn có một con trỏ, bạn có thể sử dụng con trỏ đó thay cho một biến có cùng kiểu dữ liệu trong các phép toán và lời gọi hàm. Trong ví dụ sau, con trỏ tới i được sử dụng thay vì i trong một phép toán lớn hơn. Dấu hoa thị được sử dụng với p (* p) chỉ ra rằng hoạt động nên sử dụng giá trị mà p đang trỏ đến tại địa chỉ bộ nhớ đó, không phải chính địa chỉ bộ nhớ:

int b;

b = * p + 2;

Nếu không có con trỏ, gần như không thể chia nhiệm vụ thành các chức năng ngoài hàm main trong chương trình C của bạn. Để minh họa điều này, hãy xem bạn đã tạo một biến trong main gọi là h lưu trữ chiều cao của người dùng chính xác đến từng centimet. Bạn cũng gọi một hàm mà bạn đã viết có tên setHeight nhắc người dùng đặt giá trị chiều cao đó. Các dòng trong hàm chính của bạn có thể trông giống như sau:

int h;

setHeight (h); / * Có một vấn đề tiềm ẩn ở đây. * /

Lời gọi hàm này sẽ cố gắng chuyển giá trị của h cho setHeight. Tuy nhiên, khi hàm chạy xong, giá trị của h sẽ không thay đổi vì hàm chỉ sử dụng một bản sao của nó và sau đó loại bỏ nó khi nó chạy xong.

Nếu bạn muốn thay đổi chính h, trước tiên bạn nên đảm bảo rằng hàm có thể đưa một con trỏ đến một giá trị hiện có chứ không phải là một bản sao mới của một giá trị. Sau đó, dòng đầu tiên của setHeight sẽ sử dụng một con trỏ thay vì một giá trị làm tham số của nó (lưu ý toán tử hướng dẫn):

setHeight (int * height) {/ * Các câu lệnh hàm ở đây * /}

Sau đó, bạn có hai lựa chọn để gọi setHeight. Đầu tiên là sử dụng toán tử địa chỉ cho h làm tham số truyền vào (& h). Cách khác là tạo một con trỏ riêng biệt tới h và chuyển con trỏ đó thay thế. Phần sau hiển thị cả hai tùy chọn:

setHeight (& h); / * Chuyển địa chỉ của h vào hàm * /

int * p;

p = & h;

setHeight (p); / * Chuyển một con trỏ riêng đến địa chỉ của h vào hàm * /

Tùy chọn thứ hai cho thấy một thách thức phổ biến khi sử dụng con trỏ. Thách thức là có nhiều con trỏ đến cùng một giá trị. Điều này có nghĩa là bất kỳ thay đổi nào trong một giá trị đó đều ảnh hưởng đến tất cả các con trỏ của nó cùng một lúc. Đây có thể là một điều tốt hoặc xấu, tùy thuộc vào những gì bạn đang cố gắng hoàn thành trong chương trình của mình. Một lần nữa, thành thạo việc sử dụng con trỏ là chìa khóa quan trọng để thành thạo lập trình C. Thực hành với các gợi ý càng nhiều càng tốt để bạn sẵn sàng đối mặt với những thử thách này.

Các tính năng C mà chúng tôi đã khám phá cho đến nay cũng là điển hình trong các ngôn ngữ lập trình khác. Tuy nhiên, tiếp theo, chúng ta sẽ xem xét các yêu cầu của C đối với việc quản lý bộ nhớ cẩn thận.

Tầm quan trọng của quản lý bộ nhớ trong C

Một trong những điều làm cho C trở thành một ngôn ngữ linh hoạt là lập trình viên có thể thu nhỏ một chương trình để chạy với một lượng bộ nhớ rất nhỏ. Khi C lần đầu tiên được viết, đây là một tính năng quan trọng vì máy tính gần như không mạnh như ngày nay. Với nhu cầu hiện tại đối với các thiết bị điện tử nhỏ, từ điện thoại di động đến các thiết bị y tế nhỏ, có một mối quan tâm mới trong việc giữ cho yêu cầu bộ nhớ nhỏ đối với một số phần mềm. C là ngôn ngữ sử dụng cho hầu hết các lập trình viên, những người cần kiểm soát nhiều việc sử dụng bộ nhớ.

Để hiểu rõ hơn tầm quan trọng của việc quản lý bộ nhớ, hãy xem xét cách một chương trình sử dụng bộ nhớ. Khi bạn lần đầu tiên chạy một chương trình, chương trình sẽ tải vào bộ nhớ máy tính của bạn và bắt đầu thực thi bằng cách gửi và nhận các lệnh từ bộ xử lý của máy tính. Khi chương trình cần chạy một chức năng cụ thể, chương trình sẽ tải chức năng đó vào một phần khác của bộ nhớ trong suốt thời gian chạy của nó, sau đó bỏ bộ nhớ đó khi chức năng hoàn tất. Ngoài ra, mỗi phần dữ liệu mới được sử dụng trong chương trình chính sẽ chiếm bộ nhớ trong suốt thời gian của chương trình.

Nếu bạn muốn kiểm soát nhiều hơn tất cả những điều này, bạn cần phân bổ bộ nhớ động. C hỗ trợ phân bổ lưu trữ động, là khả năng dự trữ bộ nhớ khi bạn cần và giải phóng bộ nhớ đó ngay sau khi bạn sử dụng xong. Nhiều ngôn ngữ lập trình có phân bổ bộ nhớ tự động và thu gom rác để xử lý các tác vụ quản lý bộ nhớ này. Tuy nhiên, C cho phép (và trong một số trường hợp yêu cầu) bạn phải rõ ràng về cấp phát bộ nhớ với các hàm chính sau từ thư viện C chuẩn:

  • malloc - Viết tắt của cấp phát bộ nhớ, malloc được sử dụng để dự trữ một khối bộ nhớ có kích thước nhất định để phân tích một loại dữ liệu nhất định mà chương trình của bạn cần xử lý. Khi bạn sử dụng malloc, bạn đang tạo một con trỏ đến bộ nhớ được cấp phát. Điều này không cần thiết đối với một phần dữ liệu đơn lẻ, chẳng hạn như một số nguyên, được cấp phát ngay khi bạn khai báo lần đầu tiên (như trong int i). Tuy nhiên, nó là một phần quan trọng trong việc tạo và quản lý cấu trúc dữ liệu như mảng. Tùy chọn phân bổ bộ nhớ thay thế trong C là calloc , mà cũng xóa bộ nhớ khi nó dành riêng, và realloc , mà thay đổi kích thước bộ nhớ trước đây dành riêng.
  • miễn phí - Sử dụng miễn phí để buộc chương trình của bạn giải phóng bộ nhớ đã được gán trước đó cho một con trỏ nhất định.

Thực tiễn tốt nhất khi sử dụng malloc và miễn phí là bất kỳ thứ gì bạn phân bổ phải được giải phóng. Bất cứ khi nào bạn cấp phát một thứ gì đó, ngay cả trong một chức năng tạm thời, nó vẫn ở trong bộ nhớ cho đến khi hệ điều hành dọn sạch dung lượng. Tuy nhiên, để đảm bảo rằng bộ nhớ trống và sẵn sàng sử dụng ngay lập tức, bạn nên giải phóng bộ nhớ trước khi chức năng hiện tại thoát. Quản lý bộ nhớ này có nghĩa là bạn có thể giữ cho bộ nhớ của chương trình của bạn ở mức tối thiểu và tránh rò rỉ bộ nhớ. Rò rỉ bộ nhớ là một lỗ hổng của chương trình trong đó nó tiếp tục sử dụng ngày càng nhiều bộ nhớ cho đến khi không còn bộ nhớ nào để cấp phát, khiến chương trình bị đình trệ hoặc sập. Mặt khác, đừng quá lo lắng về việc giải phóng bộ nhớ mà bạn giải phóng, rồi làm mất đi thứ mà bạn cần sau này trong cùng một chức năng.

Trong suốt bài viết này, bạn đã học được một số cấu trúc cơ bản và các khái niệm cốt lõi của ngôn ngữ lập trình C. Chúng tôi đã xem xét lịch sử của nó, các đặc điểm chung của nó với các ngôn ngữ lập trình khác và các tính năng quan trọng khiến nó trở thành một lựa chọn độc đáo và linh hoạt cho phần mềm viết mã. Hãy chuyển sang trang tiếp theo để biết thêm nhiều thông tin, bao gồm một số hướng dẫn lập trình sẽ giúp bạn tiến xa hơn trên hành trình vào C.

Nhiều thông tin hơn

Những bài viết liên quan

  • Kiến thức cơ bản về lập trình C
  • Cách thức hoạt động của Java
  • Cách Boolean Logic hoạt động
  • PERL hoạt động như thế nào
  • Cách thức hoạt động của BIOS
  • Cách hoạt động của CGI Scripting
  • Cách hoạt động của bit và byte

Các liên kết tuyệt vời hơn

  • Hướng dẫn Lập trình C.com
  • Lập trình C tại Wikibooks
  • Bộ sưu tập trình biên dịch GNU (GCC)
  • Phần mềm Môi trường Phát triển Tích hợp Eclipse

Nguồn

  • Kernighan, Brian W., và Ritchie, Dennis M. "Ngôn ngữ lập trình C, Ấn bản thứ hai." Sảnh Prentice. Năm 1988.
  • King, KN "Lập trình C: Phương pháp tiếp cận hiện đại, phiên bản thứ hai." WW Norton & Company, Inc. 2008.