text:
Có nhiều nguyên nhân ảnh hướng đến sự phát triển tâm lý / nhân cách của trẻ khi trưởng thành, trong đó có việc những ứng xử của cha mẹ đã ít nhiều xâm phạm vào nhu cầu căn bản của trẻ, tước đoạt đi những nhu cầu đáng ra trẻ phải được hưởng. Mỗi chúng ta, khi sinh con đều có một mong muốn giản dị rằng có thể dạy con nên người và phát triển tốt nhất tiềm năng của trẻ. Tuy mong muốn mang tính phổ biến, nhưng để đạt được điều này không hề dễ dàng với bất cứ ai.
Trong qua trình nuôi dạy trẻ, mỗi một nền văn hóa, vùng miền, gia đình khác nhau lại có các cách chăm sóc trẻ khác nhau. Sự khác biệt chăm sóc còn thể hiện ở từng người mẹ trong mỗi thời điểm khác nhau với mỗi đứa con, và ngay cả với cùng một đứa trẻ. Cách chăm sóc này sẽ ảnh hưởng trực tiếp đến trẻ theo chiều hướng tích cực hoặc tiêu cực – là người trưởng thành hay không trưởng thành, mạnh mẽ hay yếu đuối, tự tin hay tự ti, tự quyết hay phụ thuộc … tương lai của trẻ ra sao phụ thuộc rất nhiều vào những chăm sóc đầu đời.
Như chúng ta đã biết, một trẻ trai được sinh ra thì không phải mặc nhiên sau này sẽ trở thành một người đàn ông; và không phải một trẻ gái được sinh ra tự nhiên sẽ trở thành một người phụ nữ. Mà để trở thành đàn ông hay phụ nữ, các em phải được giáo dục giá trị sống, định hướng giới, ngoài ra còn phụ thuộc vào các quá trình tập nhiễm, bắt chước, đồng nhất hóa về giới xảy ra tốt hay không (phụ thuộc chủ yếu vào cha mẹ) và xã hội xung quanh định dạng giới cho em ở mức độ nào (nhìn nhận em có nam tính hay không, nữ tính ít hay nhiều).
Sống cùng trong một xã hội và lớn lên cùng một thời điểm, vậy tại sao vẫn có những cá nhân thực sự trưởng thành, cống hiến cho xã hội vô cùng có ý nghĩa, nhưng ngược lại cũng có không ít cá nhân kém trưởng thành, là gánh nặng, gây cản trở sự phát triển tốt đẹp của xã hội, gây đau khổ cho người khác và cho chính bản họ? Khi suy nghĩ chín chắn, hầu hết các em đều mốn mình là người tốt, tự tin, sáng tạo, tự quyết, có ích cho xã hội… nhưng các em lại không biết sở hữu các đức tính trên bằng cách nào khi mà người quyết định đến sự hình thành cấu trúc nhân cách, đến sự trưởng thành của các em lại không hoàn toàn là các em mà là từ những chăm sóc đầu đời mà em nhận được.
Có rất nhiều nguyên nhân ảnh hướng đến sự phát triển tâm lý / nhân cách của trẻ. Trong bài viết này chúng tôi chỉ đi sâu khai thác những ứng xử của cha mẹ đã ít nhiều xâm phạm vào nhu cầu căn bản của trẻ, tước đoạt đi những nhu cấu đáng ra trẻ phải được hưởng. Điều này đã ảnh hưởng nghiêm trọng đến sự hình thành và phát triển nhân cách của trẻ, cũng là nguyên nhân làm mất cân đối đời sống tâm lý trẻ.
1. Trẻ không được yêu thương đúng mức trong thời ấu thơ
Nhiều người mẹ tin rằng trẻ sơ sinh không biết gì, do đó để người khác thay mình chăm sóc con (bà ngoại, người giúp việc…); họ cho rằng sau sinh mẹ cần được nghỉ ngơi, vì mẹ đang rất đau đớn và mệt mỏi sau một thời gian dài mang thai và sinh nở. Tuy nhiên các nhà khoa học chỉ ra rằng, gắn bó đầu đời giữa trẻ với mẹ có ý nghĩa quan trọng ảnh hưởng đến sự phát triển tâm lý thể chất của trẻ. Các nghiên cứu cho thấy trẻ được mẹ ôm ấp, yêu thương trong thời gian này sẽ được tăng cường sự nhạy cảm của các giác quan – nền tảng cho trẻ nhận biết các kích thích từ thế giới, giúp tăng cường phát triển tiềm năng trí tuệ, trẻ vui vẻ hơn khi giao tiếp và đặc biệt ít bị bệnh tật, phát triển tốt về chiều cao, cân nặng.
Be luôn cảm thấy an toàn, dễ chịu khi được mẹ bế bồng. Ảnh: Getty images
Khi mang bầu, trẻ và mẹ là một, tình trạng cộng sinh cho trẻ nhiều trải nghiệm gắn kết quen thuộc. Khi trẻ ra đời, sự cắt đứt về quan hệ cơ thể sinh học trực tiếp (dây rốn) đã tao nên một sự chia tách đầu đời, một sự mất mát lớn đối với trẻ. Để tiếp tục phát triển bình thường, trẻ cần hai mối quan hệ nữa từ người mẹ là quan hệ gián tiếp giữa hai cơ thể (thông qua ôm ấp, vuốt ve, bú mớm, chăm sóc…) và quan hệ xã hội mẹ con (nói chuyện, âu yếm, cười, giao tiếp…). Do vậy, nếu vì một lý do nào đó không thể diễn ra hai mối quan hệ sau, trẻ sẽ cảm thấy bất an.
Khi người khác chăm sóc, trẻ không còn cảm nhận thấy nhịp tim, tiếng nói và những cử chỉ quen thuộc, mất đi nhịp sinh học thân quen của mẹ, khiến trẻ có cảm giác khác lạ lẫm, lo âu, sợ hãi. Đồng thời, khi sinh con, về mặt bản năng người mẹ rất nhạy cảm với những phản ứng của trẻ, sự nhạy cảm này giúp người mẹ đoán biết chính xác các nhu cầu, đòi hỏi, các biểu hiện cảm xúc bình thường / bất thường ở trẻ. Nếu bị mất đi chức năng chăm sóc này, trẻ luôn cảm thấy bực bội dẫn đến các ức chế tâm lý.
2. Ép trẻ đi vệ sinh
Thông thường trẻ em mới sinh cho đến 1 tuổi, việc đi tiêu, tiểu tự nhiên mà không phải tuân theo giờ giấc và quy định của người lớn mà tùy theo các phản xạ sinh học tự nhiên và theo ý muốn của trẻ. Đây là một nhu cầu căn bản mà bất cứ ai cũng phải tôn trọng. Trẻ có thể thoải mái và thích thú khi nào trẻ muốn và không muốn (đi) mà không cần tuân theo bất cứ quy định đúng đắn nào.
Khi nói về chủ đề này, hiện nay không ít bà mẹ đã vô tình hay cố ý xâm phạm vào nhu cầu của trẻ, họ luôn hướng tới sự sạch sẽ theo cách nhìn của người lớn (tuân thủ các quy định của cá nhân hay gia đình); họ cho rằng trẻ cần đi vệ sinh đúng giờ, cần tập cho trẻ vệ sinh ở nhà trước khi đi đến trường, trẻ phải đi vệ sinh đúng nơi quy định, tập cho trẻ có thói quen từ nhỏ… Việc tập cho trẻ đi vệ sinh sạch sẽ không hoàn toàn sai trái, nhưng nếu chúng ta không quan tâm đến thời điểm phù hợp cho từng nội dung tập, mà tập quá sớm sẽ dẫn đến các cảm giác khó chịu, ức chế tâm lý ở trẻ, xâm phạm vào nhu cầu căn bản của trẻ, tước đi một sự thích thú ở trẻ. Trẻ có thể bị táo bón từ nguyên nhân này.
3. Người lớn xâm phạm vào nhu cầu muốn giao tiếp của trẻ
Cũng như người lớn, trẻ em thích giao tiếp với một số người và không giao tiếp với một số người, đó là nhu cầu liên kết của trẻ. Trong cuộc sống, trẻ được tương tác với những người khác ngoài gia đình vừa là nhu cầu vừa là sự trải nghiệm cần thiết, hoạt động giao tiếp giúp trẻ nhận biết bản thân hoàn chỉnh hơn, cung cấp cho trẻ khả năng ứng phó – giải quyết vấn đề trong cuộc sống hiện tại và tương lai, giúp trẻ dễ dàng vượt qua stress trong cuộc sống sau này. Giao tiếp không đầy đủ sẽ làm mất đi sự nhạy cảm trong phát triển trí tuệ nói chung, đặc biệt là trí tuệ cảm xúc.
Giao tiếp sẽ giúp bé phát triển trí tuệ, đặc biệt là trí tuệ cảm xúc. Ảnh: Getty imges.
Việc bảo vệ trẻ trước các nguy hiểm có tác nhân môi trường là điều cần thiết và đúng đắn. Tuy nhiên, trong cuộc sống, một số bậc phụ huynh có những suy nghĩ thái quá và cho rằng môi trường xung quanh là nguy hiểm như: trẻ con rất dễ bị lây bệnh bởi người khác, sợ bụi, dơ bẩn, nắng, gió, sợ môi trường xã hội bên ngoài không tốt… nên tuyệt đối giữ trẻ trong phòng, không bao giờ (hoặc rất ít khi) cho trẻ ra ngoài. Ngoài ra việc không cho trẻ ra ngoài còn một số lý do có nguyên do từ chính cha mẹ: cha mẹ là người khép kín, trẻ bị khuyết tật, cha mẹ không chấp nhận con, không yêu con, có nhiều bí mật gia đình cần che giấu, cha mẹ tự ti…
Việc cấm đoán từ cha mẹ trong nhiều nội dung sinh hoạt của trẻ là cần thiết, tuy nhiên nếu không cân nhắc kỹ và xây dựng mục tiêu định hướng, các bậc cha mẹ có thể làm mất các cơ hội phát triển giao tiếp của trẻ, tước đi nhu cầu được giao lưu của trẻ.
4. Người lớn xâm phạm vào nhu cầu không muốn giao tiếp
Ngoài việc thiếu nhu cầu giao tiếp, một số trẻ còn phải chịu một tình trạng chăm sóc trái ngược lại là: bị giao tiếp quá nhiều. Nghĩa là, trong cuộc sống, ngoài việc trẻ cần giao tiếp với người khác thì có những lúc trẻ rất cần một khoảng thời gian tự chơi một mình. Quá trình này giúp cho trẻ trạng thái cân bằng để phát triển. Xâm phạm vào nhu cầu này của trẻ thường là những bậc cha mẹ có những vấn đề tâm lý, họ không thể không gây sự chú ý cho trẻ vì nhu cầu được giao tiếp ở chính họ, trầm trọng hóa các phản ứng của trẻ như một tín hiệu được giúp đỡ và luôn giúp đỡ trẻ ngay cả khi trẻ không muốn. Đồng thời trẻ con là một báu vật trong nhà nên ai cũng muốn giành giật sự quan tâm chăm sóc để nhận được sự cổ vũ của các thành viên khác trong gia đình, vợ chồng mâu thuẫn thường tranh giành đồng minh – là những đứa trẻ, quá khứ bị bỏ rơi hay nỗi ám sợ mất con làm cho người mẹ không rời con nửa bước.
Hậu quả là trẻ luôn luôn phải giao tiếp; và với tình trạng thường xuyên bị đặt trong tình huống phải giao tiếp này thì (ngoài khi ngủ ra) lúc nào trẻ cũng phải căng ra để giao tiếp, trẻ sẽ cảm thấy mệt mỏi và sợ hãi, sợ chính những người thân của mình, có khi là cả người mẹ. Nhu cầu an toàn của trẻ bị tước đoạt.
ST: ThuyDuong

markdown:
Có nhiều nguyên nhân ảnh hướng đến sự phát triển tâm lý / nhân cách của trẻ khi trưởng thành, trong đó có việc những ứng xử của cha mẹ đã ít nhiều xâm phạm vào nhu cầu căn bản của trẻ, tước đoạt đi những nhu cầu đáng ra trẻ phải được hưởng. Mỗi chúng ta, khi sinh con đều có một mong muốn giản dị rằng có thể dạy con nên người và phát triển tốt nhất tiềm năng của trẻ. Tuy mong muốn mang tính phổ biến, nhưng để đạt được điều này không hề dễ dàng với bất cứ ai.
Trong qua trình
[nuôi dạy trẻ](/danh-muc/phuong-phap-nuoi-day-con), mỗi một nền văn hóa, vùng miền, gia đình khác nhau lại có các cách chăm sóc trẻ khác nhau. Sự khác biệt chăm sóc còn thể hiện ở từng người mẹ trong mỗi thời điểm khác nhau với mỗi đứa con, và ngay cả với cùng một đứa trẻ. Cách chăm sóc này sẽ ảnh hưởng trực tiếp đến trẻ theo chiều hướng tích cực hoặc tiêu cực – là người trưởng thành hay không trưởng thành, mạnh mẽ hay yếu đuối, tự tin hay tự ti, tự quyết hay phụ thuộc … tương lai của trẻ ra sao phụ thuộc rất nhiều vào những chăm sóc đầu đời.
Như chúng ta đã biết, một trẻ trai được sinh ra thì không phải mặc nhiên sau này sẽ trở thành một người đàn ông; và không phải một trẻ gái được sinh ra tự nhiên sẽ trở thành một người phụ nữ. Mà để trở thành đàn ông hay phụ nữ, các em phải được giáo dục giá trị sống, định hướng giới, ngoài ra còn phụ thuộc vào các quá trình tập nhiễm, bắt chước, đồng nhất hóa về giới xảy ra tốt hay không (phụ thuộc chủ yếu vào cha mẹ) và xã hội xung quanh định dạng giới cho em ở mức độ nào (nhìn nhận em có nam tính hay không, nữ tính ít hay nhiều).
Sống cùng trong một xã hội và lớn lên cùng một thời điểm, vậy tại sao vẫn có những cá nhân thực sự trưởng thành, cống hiến cho xã hội vô cùng có ý nghĩa, nhưng ngược lại cũng có không ít cá nhân kém trưởng thành, là gánh nặng, gây cản trở sự phát triển tốt đẹp của xã hội, gây đau khổ cho người khác và cho chính bản họ? Khi suy nghĩ chín chắn, hầu hết các em đều mốn mình là người tốt, tự tin, sáng tạo, tự quyết, có ích cho xã hội… nhưng các em lại không biết sở hữu các đức tính trên bằng cách nào khi mà người quyết định đến sự hình thành cấu trúc nhân cách, đến sự trưởng thành của các em lại không hoàn toàn là các em mà là từ những chăm sóc đầu đời mà em nhận được.
Có rất nhiều nguyên nhân ảnh hướng đến sự phát triển tâm lý / nhân cách của trẻ. Trong bài viết này chúng tôi chỉ đi sâu khai thác những ứng xử của cha mẹ đã ít nhiều xâm phạm vào nhu cầu căn bản của trẻ, tước đoạt đi những nhu cấu đáng ra trẻ phải được hưởng. Điều này đã ảnh hưởng nghiêm trọng đến sự hình thành và phát triển nhân cách của trẻ, cũng là nguyên nhân làm mất cân đối đời sống tâm lý trẻ.
**1. Trẻ không được yêu thương đúng mức trong thời ấu thơ**
Nhiều người mẹ tin rằng trẻ sơ sinh không biết gì, do đó để người khác thay mình chăm sóc con (bà ngoại, người giúp việc…); họ cho rằng
**sau sinh** mẹ cần được nghỉ ngơi, vì mẹ đang rất đau đớn và mệt mỏi sau một thời gian dài **mang thai** và sinh nở. Tuy nhiên các nhà khoa học chỉ ra rằng, gắn bó đầu đời giữa trẻ với mẹ có ý nghĩa quan trọng ảnh hưởng đến sự phát triển tâm lý thể chất của trẻ. Các nghiên cứu cho thấy trẻ được mẹ ôm ấp, yêu thương trong thời gian này sẽ được tăng cường sự nhạy cảm của các giác quan – nền tảng cho trẻ nhận biết các kích thích từ thế giới, giúp tăng cường phát triển tiềm năng trí tuệ, trẻ vui vẻ hơn khi giao tiếp và đặc biệt ít bị bệnh tật, phát triển tốt về chiều cao, cân nặng. *Be luôn cảm thấy an toàn, dễ chịu khi được mẹ bế bồng. Ảnh: Getty images*
Khi mang bầu, trẻ và mẹ là một, tình trạng cộng sinh cho trẻ nhiều trải nghiệm gắn kết quen thuộc. Khi trẻ ra đời, sự cắt đứt về quan hệ cơ thể sinh học trực tiếp (dây rốn) đã tao nên một sự chia tách đầu đời, một sự mất mát lớn đối với trẻ. Để tiếp tục phát triển bình thường, trẻ cần hai mối quan hệ nữa từ người mẹ là quan hệ gián tiếp giữa hai cơ thể (thông qua ôm ấp, vuốt ve, bú mớm, chăm sóc…) và quan hệ xã hội mẹ con (nói chuyện, âu yếm, cười, giao tiếp…). Do vậy, nếu vì một lý do nào đó không thể diễn ra hai mối quan hệ sau, trẻ sẽ cảm thấy bất an.
Khi người khác chăm sóc, trẻ không còn cảm nhận thấy nhịp tim, tiếng nói và những cử chỉ quen thuộc, mất đi nhịp sinh học thân quen của mẹ, khiến trẻ có cảm giác khác lạ lẫm, lo âu, sợ hãi. Đồng thời, khi sinh con, về mặt bản năng người mẹ rất nhạy cảm với những phản ứng của trẻ, sự nhạy cảm này giúp người mẹ đoán biết chính xác các nhu cầu, đòi hỏi, các biểu hiện cảm xúc bình thường / bất thường ở trẻ. Nếu bị mất đi chức năng chăm sóc này, trẻ luôn cảm thấy bực bội dẫn đến các ức chế tâm lý.
**2. Ép trẻ đi vệ sinh**
Thông thường trẻ em
**mới sinh** cho đến 1 tuổi, việc đi tiêu, tiểu tự nhiên mà không phải tuân theo giờ giấc và quy định của người lớn mà tùy theo các phản xạ sinh học tự nhiên và theo ý muốn của trẻ. Đây là một nhu cầu căn bản mà bất cứ ai cũng phải tôn trọng. Trẻ có thể thoải mái và thích thú khi nào trẻ muốn và không muốn (đi) mà không cần tuân theo bất cứ quy định đúng đắn nào.
Khi nói về chủ đề này, hiện nay không ít bà mẹ đã vô tình hay cố ý xâm phạm vào nhu cầu của trẻ, họ luôn hướng tới sự sạch sẽ theo cách nhìn của người lớn (tuân thủ các quy định của cá nhân hay gia đình); họ cho rằng trẻ cần đi vệ sinh đúng giờ, cần tập cho trẻ vệ sinh ở nhà trước khi đi đến trường, trẻ phải đi vệ sinh đúng nơi quy định, tập cho trẻ có thói quen từ nhỏ… Việc tập cho trẻ đi vệ sinh sạch sẽ không hoàn toàn sai trái, nhưng nếu chúng ta không quan tâm đến thời điểm phù hợp cho từng nội dung tập, mà tập quá sớm sẽ dẫn đến các cảm giác khó chịu, ức chế tâm lý ở trẻ, xâm phạm vào nhu cầu căn bản của trẻ, tước đi một sự thích thú ở trẻ. Trẻ có thể bị táo bón từ nguyên nhân này.
**3. Người lớn xâm phạm vào nhu cầu muốn giao tiếp của trẻ**
Cũng như người lớn, trẻ em thích giao tiếp với một số người và không giao tiếp với một số người, đó là nhu cầu liên kết của trẻ. Trong cuộc sống, trẻ được tương tác với những người khác ngoài gia đình vừa là nhu cầu vừa là sự trải nghiệm cần thiết, hoạt động giao tiếp giúp trẻ nhận biết bản thân hoàn chỉnh hơn, cung cấp cho trẻ khả năng ứng phó – giải quyết vấn đề trong cuộc sống hiện tại và tương lai, giúp trẻ dễ dàng vượt qua stress trong cuộc sống sau này. Giao tiếp không đầy đủ sẽ làm mất đi sự nhạy cảm trong phát triển trí tuệ nói chung, đặc biệt là trí tuệ cảm xúc.
*Giao tiếp sẽ giúp bé phát triển trí tuệ, đặc biệt là trí tuệ cảm xúc. Ảnh: Getty imges.*
Việc bảo vệ trẻ trước các nguy hiểm có tác nhân môi trường là điều cần thiết và đúng đắn. Tuy nhiên, trong cuộc sống, một số bậc phụ huynh có những suy nghĩ thái quá và cho rằng môi trường xung quanh là nguy hiểm như: trẻ con rất dễ bị lây bệnh bởi người khác, sợ bụi, dơ bẩn, nắng, gió, sợ môi trường xã hội bên ngoài không tốt… nên tuyệt đối giữ trẻ trong phòng, không bao giờ (hoặc rất ít khi) cho trẻ ra ngoài. Ngoài ra việc không cho trẻ ra ngoài còn một số lý do có nguyên do từ chính cha mẹ: cha mẹ là người khép kín, trẻ bị khuyết tật, cha mẹ không chấp nhận con, không yêu con, có nhiều bí mật gia đình cần che giấu, cha mẹ tự ti…
Việc cấm đoán từ cha mẹ trong nhiều nội dung sinh hoạt của trẻ là cần thiết, tuy nhiên nếu không cân nhắc kỹ và xây dựng mục tiêu định hướng, các bậc cha mẹ có thể làm mất các cơ hội phát triển giao tiếp của trẻ, tước đi nhu cầu được giao lưu của trẻ.
**4. Người lớn xâm phạm vào nhu cầu không muốn giao tiếp**
Ngoài việc thiếu nhu cầu giao tiếp, một số trẻ còn phải chịu một tình trạng chăm sóc trái ngược lại là: bị giao tiếp quá nhiều. Nghĩa là, trong cuộc sống, ngoài việc trẻ cần giao tiếp với người khác thì có những lúc trẻ rất cần một khoảng thời gian tự chơi một mình. Quá trình này giúp cho trẻ trạng thái cân bằng để phát triển. Xâm phạm vào nhu cầu này của trẻ thường là những bậc cha mẹ có những vấn đề tâm lý, họ không thể không gây sự chú ý cho trẻ vì nhu cầu được giao tiếp ở chính họ, trầm trọng hóa các phản ứng của trẻ như một tín hiệu được giúp đỡ và luôn giúp đỡ trẻ ngay cả khi trẻ không muốn. Đồng thời trẻ con là một báu vật trong nhà nên ai cũng muốn giành giật sự quan tâm chăm sóc để nhận được sự cổ vũ của các thành viên khác trong gia đình, vợ chồng mâu thuẫn thường tranh giành đồng minh – là những đứa trẻ, quá khứ bị bỏ rơi hay nỗi ám sợ mất con làm cho người mẹ không rời con nửa bước.
Hậu quả là trẻ luôn luôn phải giao tiếp; và với tình trạng thường xuyên bị đặt trong tình huống phải giao tiếp này thì (ngoài khi ngủ ra) lúc nào trẻ cũng phải căng ra để giao tiếp, trẻ sẽ cảm thấy mệt mỏi và sợ hãi, sợ chính những người thân của mình, có khi là cả người mẹ. Nhu cầu an toàn của trẻ bị tước đoạt.
**ST: ThuyDuong**

Set-Cookie: _CookiesCustomerId=PC1AFCC5101F3A4,1; expires=Thu, 16-Aug-2018 17:42:18 GMT; path=/


text:
Axit folic có vai trò rất quan trọng đối với thai nhi giúp ngãn ngừa các dị tật về ống dây thần kinh đồng thời cả vấn đề thiếu máu khi mang thai. Tuy nhiên, ngoài biện pháp sử dụng các loại thuốc bổ giàu axit folic thì bạn có thể tận dụng những nguồn axit folic phong phú từ thực phẩm bởi đây là cách tự nhiên hơn và bổ dưỡng hơn. Vậy hãy lưu ý các thực phẩm giúp bổ sung axit folic cho mẹ bầu sau đây nhé.
Bánh mỳ, ngũ cốc giàu axit folic
Thực phẩm làm từ ngũ cốc giàu axit folic (axit folic được bổ sung vào hạt sau khi chế biến) có gấp đôi số lượng axit folic thường thấy trong nhiều thực phẩm không được bổ sung.
Một lát bánh mỳ bổ sung axit folic chứa 60mcg axit folic. Khi sử dụng các sản phẩm được bổ sung axit folic, cố gắng ăn cùng một loại thức ăn giàu folate (như súp lơ xanh hoặc thêm rau lá xanh sậm vào bánh sandwich) để lượng axit folic hấp thu vào cơ thể được nhiều hơn.
Trứng
Một món trứng tráng gồm 3 quả trứng có khoảng 1/4 lượng axit folic mà bạn cần. Ngoài ra, trứng còn cung cấp protein và một loạt các vitamin và khoáng chất khác cần thiết trong thai kì.
Rau có lá xanh sậm
Các folate (dạng tự nhiên của axit folic) bắt nguồn từ lá rau. Rau bina (chân vịt) đứng hàng đầu trong các loại rau về hàm lượng folate. Ngoài ra thì rau diếp, rau xà lách cũng dồi dào chất này.
Họ nhà cam quýt
Uống một ly nước cam ép là một cách tốt để hấp thụ axit folic. Các quả có múi như: dứa, bưởi cũng là nguồn cung cấp folate.
Các loại quả mọng
Những quả này có chứa hàm lượng axit folic cao nhất trong các loại trái cây bất kỳ, thậm chí có chứa khoảng 20% folate bạn cần trong một ngày. Chúng cũng làm tăng lượng chất xơ và được coi là đồ ăn nhẹ vì ít calorie.
Các loại đậu, đỗ
Một nửa bát đỗ nấu chín chứa tới 115 mcg axit folic. Bạn có thể mua đỗ khô và nấu chín nhưng nếu dùng đỗ ngâm đóng hộp cũng không sao vì chúng có cùng một hàm lượng axit folic.
Súp lơ xanh
Một bát soup súp lơ xanh có tới 104mcg axit folic (khoảng ¼ nhu cầu axit folic hàng ngày). Ngoài ra, súp lơ xanh còn giàu canxi, vitamin C, chất xơ và sắt.
Hạt hướng dương
Trong số các loại thực phẩm có hạt có axit folic thì hạt hướng dương nằm trong danh sách các loại hạt có hàm lượng folate cao nhất. Hạt hướng dương là đặc biệt giàu folate, nhưng bạn cũng có thể chọn các loại hạt khác như hạt vừng hay quả óc chó để thay thế hạt hướng dương nếu muốn.
Quả bơ
Khi nói đến dinh dưỡng trước khi mang thai, quả bơ là nguồn chất tuyệt hảo. Một nửa quả bơ chứa 90mcg folate. Nhưng không chỉ thế, giống như cá hồi và quả óc chó, quả bơ rất nhiều axit béo omega 3 (chất béo lành mạnh, tốt cho tim của mẹ và não của bé).
Nước cà chua
Một cốc nước ép cà chua có 48mcg axit folic. Ngoài ra, nước ép cà chua còn giúp cơ thể hấp thu sắt tối đa, nhất là khi bạn đang dùng viên bổ sung sắt. Nếu nước ép cà chua không phải món ăn ưa thích của bạn thì một bát soup cà chua được xem là thay thế hoàn hảo.

markdown:
Axit folic có vai trò rất quan trọng đối với thai nhi giúp ngãn ngừa các dị tật về ống dây thần kinh đồng thời cả vấn đề thiếu máu khi mang thai. Tuy nhiên, ngoài biện pháp sử dụng các loại thuốc bổ giàu axit folic thì bạn có thể tận dụng những nguồn axit folic phong phú từ thực phẩm bởi đây là cách tự nhiên hơn và bổ dưỡng hơn. Vậy hãy lưu ý các thực phẩm giúp bổ sung axit folic cho mẹ bầu sau đây nhé.
**Bánh mỳ, ngũ cốc giàu axit folic**
Thực phẩm làm từ ngũ cốc giàu axit folic (axit folic được bổ sung vào hạt sau khi chế biến) có gấp đôi số lượng axit folic thường thấy trong nhiều thực phẩm không được bổ sung.
Một lát bánh mỳ bổ sung axit folic chứa 60mcg axit folic. Khi sử dụng các sản phẩm được bổ sung axit folic, cố gắng ăn cùng một loại thức ăn giàu folate (như súp lơ xanh hoặc thêm rau lá xanh sậm vào bánh sandwich) để lượng axit folic hấp thu vào cơ thể được nhiều hơn.
**Trứng**
Một món trứng tráng gồm 3 quả trứng có khoảng 1/4 lượng axit folic mà bạn cần. Ngoài ra, trứng còn cung cấp protein và một loạt các vitamin và khoáng chất khác cần thiết trong thai kì.
**Rau có lá xanh sậm**
Các folate (dạng tự nhiên của axit folic) bắt nguồn từ lá rau. Rau bina (chân vịt) đứng hàng đầu trong các loại rau về hàm lượng folate. Ngoài ra thì rau diếp, rau xà lách cũng dồi dào chất này.
**Họ nhà cam quýt**
Uống một ly nước cam ép là một cách tốt để hấp thụ axit folic. Các quả có múi như: dứa, bưởi cũng là nguồn cung cấp folate.
**Các loại quả mọng**
Những quả này có chứa hàm lượng axit folic cao nhất trong các loại trái cây bất kỳ, thậm chí có chứa khoảng 20% folate bạn cần trong một ngày. Chúng cũng làm tăng lượng chất xơ và được coi là đồ ăn nhẹ vì ít calorie.
**Các loại đậu, đỗ**
Một nửa bát đỗ nấu chín chứa tới 115 mcg axit folic. Bạn có thể mua đỗ khô và nấu chín nhưng nếu dùng đỗ ngâm đóng hộp cũng không sao vì chúng có cùng một hàm lượng axit folic.
**Súp lơ xanh**
Một bát soup súp lơ xanh có tới 104mcg axit folic (khoảng ¼ nhu cầu axit folic hàng ngày). Ngoài ra, súp lơ xanh còn giàu canxi, vitamin C, chất xơ và sắt.
**Hạt hướng dương**
Trong số các loại thực phẩm có hạt có axit folic thì hạt hướng dương nằm trong danh sách các loại hạt có hàm lượng folate cao nhất. Hạt hướng dương là đặc biệt giàu folate, nhưng bạn cũng có thể chọn các loại hạt khác như hạt vừng hay quả óc chó để thay thế hạt hướng dương nếu muốn.
**Quả bơ**
Khi nói đến dinh dưỡng trước khi mang thai, quả bơ là nguồn chất tuyệt hảo. Một nửa quả bơ chứa 90mcg folate. Nhưng không chỉ thế, giống như cá hồi và quả óc chó, quả bơ rất nhiều axit béo omega 3 (chất béo lành mạnh, tốt cho tim của mẹ và não của bé).
**Nước cà chua**
Một cốc nước ép cà chua có 48mcg axit folic. Ngoài ra, nước ép cà chua còn giúp cơ thể hấp thu sắt tối đa, nhất là khi bạn đang dùng viên bổ sung sắt. Nếu nước ép cà chua không phải món ăn ưa thích của bạn thì một bát soup cà chua được xem là thay thế hoàn hảo.

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Identified-Payload-Type: text/html

Connection: close

Cache-Control: private

Set-Cookie: _CookiesCustomerId=PC6F805A9971494,1; expires=Thu, 16-Aug-2018 17:42:14 GMT; path=/

Content-Type: text/html; charset=utf-8


text:
Kiểu và khai báo biến trong C
Ngôn ngữ lập trình C có một hệ thống mở rộng cho việc khai báo các biến của các kiểu khác nhau. Những quy tắc dành cho các kiểu phức tạp có thể gây nhầm lẫn tùy theo các kiểu thiết kế của chúng. Bài này nói về các khai báo biến, bắt đầu từ các kiểu đơn giản, và dẫn tới các kiểu phức tạp hơn.
Kiểu cơ bản[sửa | sửa mã nguồn]
Có 4 kiểu cơ bản của các biến trong C; đó là:
char,
int,
double và
float.
Để khai báo một biến có kiểu cơ bản, tên của kiểu được ghi ra trước sau đó đến tên của biến mới (hay của nhiều biến mới cách phân cách nhau bởi dấu phẩy) -- (Xem thêm định nghĩa dãy điểm)
char red; int blue, yellow;
Các định tính khác nhau có thể đặt vào trong các kiểu cơ bản này để điều chỉnh kích cỡ và sẽ được miêu tả trong phần sau.
Lưu ý: Ở đây chỉ nêu ra trường hợp khai báo đơn giản không đi kèm với việc gán giá trị khởi động cho biến
Dấu[sửa | sửa mã nguồn]
Một kiểu được gọi là có dấu nếu kiểu nguyên đó có thể chứa các số âm. Ngược lại các kiểu cơ bản nào không chấp nhận các số âm là kiểu không dấu.
Có hai kiểu nguyên là
char và
int có thể có dấu âm hoặc không. Theo mặc định thì mọi kiểu
int là có dấu (nghĩa là chúng chấp nhận các số âm). Để dùng dưới dạng không có dấu (tức là kiểu nguyên chỉ chấp nhận các sô không âm) thì từ khoá
unsigned phải được dùng. Ngoài ra, thay vì khai báo đầy đủ trong dạng
unsigned int, người ta có thể lược bỏ bớt từ khóa
int (và nó được xem như hiểu ngầm—điều này chỉ dùng được cho kiểu
int mà thôi). Như vậy hai khai báo sau đây hoàn toàn tương đương:
unsigned int green; unsigned green;
Đặc tả của C không xác định rõ ràng là kiểu
char sẽ là loại có dấu hay không dấu; khi đó, dấu của kiểu này tùy thuộc vào quy định của nhà phát hành trình dịch. Như vậy, một cách để giảm sai sót khi làm việc trên nhiều loại trình dịch C khác nhau là khai báo rõ ràng bằng các định tính
signed hay
unsigned nếu dùng kiểu
char để tính toán trên các con số. (Dù sao, nó thực sự sẽ không quá quan trọng nếu dùng kiểu
char như là kiểu "ký tự".)
unsigned char grey; signed char white;
Tiêu chuẩn chung yêu cầu
char,
signed char,
unsigned char là các kiểu khác nhau. Ngoài ra, các hàm chuẩn về dãy các ký tự sử dụng các con trỏ chỉ tới kiểu
char (không có định tính), nhiều trình dịch C sẽ bắt lỗi (hay cảnh cáo) nếu các kiểu ký tự khác được dùng như là dãy ký tự được chuyển vào các hàm này.
Kích cỡ[sửa | sửa mã nguồn]
- Trong phần này hai cụm từ "chiếm" và "có độ dài" đều có nghĩa là "phần bộ nhớ cần thiết để dành cho một biến"; biến này có kiểu được miêu tả tùy theo chi tiết của bài viết.
Kiểu
int cũng có các định tính về kích cỡ để đặc biệt hóa tầm rộng của giá trị mà kiểu này cho phép (tương ứng với đó là việc thay đổi phần bộ nhớ dùng để chứa các số có kiểu này).
short int yellow; long int orange;
Tương tự như đã đề cập trong phần trước, người ta có thể bỏ không viết từ khóa
int trong các kiểu mà đầy đủ phải viết là
short int or
long int. Thí dụ của hai khai báo sau đây là tương đương.
long int brown; long brown;
Có một số nhầm lẫn trong giới hiểu biết về C như là các kiểu nguyên có độ lớn bao nhiêu. Trong tiêu chuẩn thì không chỉ một cách rõ ràng việc này:
- Kiểu
short intkhông thể lớn hơn kiểu
int.
- Kiểu
intkhông thể lớn hơn
long int.
- Kiểu
short intphải dài ít nhất 16 bit.
- Kiểu
long intphải dài ít nhất 32 bit.
Trong tiêu chuẩn đã không đòi hỏi gì về các kích cỡ nêu trên và những khác nhau cần thiết. (Nghĩa là hoàn toàn hợp lệ nếu cả ba kiểu đều dài 64 bit!) Để có được một miêu tả chính xác và đơn giản của các kiểu, mỗi loại máy tính người ta áp dụng vào trong mỗi kiểu (cũng như là kích cỡ của một kiểu con trỏ; xem phần đưới đây) một loại lược đồ đã được tạo ra; (xem:64-Bit Programming Models). Hai lược đồ được biết nhiều nhất là
-
ILP32, trong đó
int,
long intvà các kiểu con trỏ chiếm 32 bit.
LP64, trong đó,
long intvà con trỏ mỗi loại chiếm 64 bit, còn
intcó độ dài 32 bit.
-
Hầu hết các trình dịch dùng các lược đồ trên dùng 16 bit cho kiểu
short int.
Một biến
double có thể là một
long double, mà trình dịch có thể sử dụng thay cho một kiểu
double thuần túy. Tương tự tình huống trước, chuẩn C không hề nêu rõ các kích cỡ tương đối giữa các giá trị dấu chấm động, mà chỉ đòi hỏi
float không được lớn hơn
long double về kích cỡ.
Từ khóa định tính
const cho các kiểu[sửa | sửa mã nguồn]
Để giúp tăng cường độ an toàn trong các chương trình, các giá trị có thể được đánh dấu là các hằng bằng từ khóa định tính
const. Với từ khóa này thì một biến khai báo trở thành một hằng. Mọi thao tác do vô ý hay cố ý để điều chỉnh giá trị của nó sẽ bị báo lỗi bởi hầu hết các trình dịch. Bởi vì sau khi đã dùng từ khóa định tính
const thì các giá trị của biến không thể thay đổi nữa nên người lập trình phải gán giá trị ban đầu ngay lúc khai báo.
Chuẩn C cho phép hoán đổi vị trí của các hiệu chính. Thí dụ cả hai khai báo hằng sau đây là tương đương
int const black = 12; const int black = 12;
Cách khai báo đầu thường phản ánh cách dùng
const trong cách dùng kiểu con trỏ trong khi cách thứ nhì lại tự nhiên hơn và phổ dụng hơn.
Con trỏ[sửa | sửa mã nguồn]
Một biến có thể được khai báo như là một con trỏ chỉ đến các giá trị có kiểu nào đó, với ý nghĩa của dùng từ khóa định tính *. Để khai báo chỉ việc viết thêm ngay trước tên biến một dấu sao:
char *square; long *circle;
Lưu ý: Nếu dùng nhiều hơn một dấu sao thì sẽ tạo nên dạng các con trỏ đứng trước chỉ vào con trỏ đứng sau và con trỏ cuối cùng mới chỉ đến địa chỉ của giá trị biến.
Trong cuốn "The C Programming Language" (Ngôn ngữ lập trình C) có cho một giải thích tường tận về việc "hơi kì cục" khi dùng dấu sao trước tên của biến, trong khi dường như việc dùng dấu sao này đứng trước tên của kiểu thì có vẻ "hợp lý" hơn. Đó chính là việc tham chiếu ngược con trỏ, nó có kiểu của đối tượng mà nó chỉ tới. Trong thí dụ trên,
*circle là một giá trị của kiểu
long. Trong khi điều này khó thấy rõ trong thí dụ trên, thì nó lại cho thấy ưu điểm nếu dùng trong các kiểu phức hợp. Đây là lý do tại sao C "hơi kì cục" trong cách khai báo các kiểu phức hợp, lúc đó, tên của biến sẽ không còn rõ ràng trong khi khai báo kiểu như các thí dụ sẽ nêu trong phần tiếp sau đây.
Có một kiểu đặc biệt của giá trị mà không thể dùng được trực tiếp như là biến có kiểu, nhưng lại có thể chỉ đến nó nếu khai báo con trỏ.
void *triangle;
Giá trị được chỉ tới ở đây không thể dùng trực tiếp được; mọi cố gắng để tham chiếu ngược con trỏ này sẽ dẫn tới một lỗi. Sự tiện lợi ở đây là vì nó là một con trỏ "tổng quát"; nó hữu dụng khi làm việc trên dữ liệu mà kiểu được chỉ tới là không giữ vai trò gì quan trọng. Đơn giản chỉ cần cái địa chỉ con trỏ. Nó thường được ứng dụng để chứa các con trỏ trong các kiểu để làm tiện ích như là danh sách liên kết, bảng băm (hash). Khi nào cần thì tiện ích sẽ đổi kiểu (typecast) thành con trỏ có kiểu cần dùng. Sau đây là thí dụ về các khai báo con trỏ hợp lệ:
long int *rectangle; unsigned short int *rhombus; const char *kite;
Lưu ý đặc biệt về việc dùng
const trong trường hợp cuối cùng: ở đây
kite là một con trỏ không phải là hằng chỉ tới một
const char (tức là nó chỉ tới là một hằng có kiểu ký tự). Giá trị của
kite tự nó không phải là hằng, chỉ có giá trị của
char mà nó chỉ tới là một hằng. hay nói ngắn gọn hơn thì con trỏ
kite có thể thay đổi để trỏ tới địa chỉ khác, nhưng giá trị tại địa chỉ mà con trỏ đang trỏ tới không thay đổi được. Vị trí của từ khoá
const đặt sau kiểu sẽ cho một cách thức để khai báo hằng con trỏ. Và như là một hằng, nó phải được gán giá trị khởi động khi khai báo:
char * const pentagon = &some_char;
Ở đây,
pentagon là một hằng con trỏ, mà nó chỉ tới một
char. Giá trị mà nó chỉ tới lại không là một hằng; và sẽ không gây lỗi khi thay đổi ký tự được nó chỉ tới. Chỉ khi nào thay đổi chính con trỏ này thì sẽ gây lỗi (vì đã khai báo nó là hằng). Cũng có thể khai báo cả hai: con trỏ và giá trị mà nó chỉ tới đều là hằng. Có hai cách tương đương nếu muốn khai báo như vậy là:
char const * const hexagon = &some_char; const char * const hexagon = &some_char;
Con trỏ chỉ tới con trỏ[sửa | sửa mã nguồn]
Vì lý do một khai báo chẳng hạn như
char * tự nó là một kiểu, nên một biến con trỏ có thể được khai báo để nó chỉ vào các giá trị có kiểu như vây. Nói gọn hơn, chúng là con trỏ chỉ tới các con trỏ. Thí dụ:
char **septagon;
Như đã đề cập phần trên các từ khóa định tính
const có thể áp dụng vào chẳng hạn:
unsigned long const int * const *octogon;
Dòng trên khai báo
octogon là một con trỏ chỉ tới một hằng con trỏ, và hằng con trỏ này trở lại chỉ tới một hằng số nguyên dạng
unsigned long. Các kiểu con trỏ có thể lồng nhau, nhưng chúng càng trở nên khó khăn để nghĩ tới việc sử dụng khi mà càng nhiều cấp độ của sự gián tiếp tham gia vào. Mọi mã dùng nhiều hơn hai cấp độ của con trỏ có thể sẽ cần tới một sự thiết kế, dạng
struct các con trỏ.
Mảng[sửa | sửa mã nguồn]
Đối với nhiều người lập trình, trong hầu hết các ngôn ngữ tương tự C, kiểu của một mảng nằm trong số phần tử mà nó chứa. Do vậy, khai báo sau đây có thể dùng trong các ngôn ngữ như Java hay C# để khai báo một mảng 10 giá trị số nguyên.
int[10] cat; /* THIS IS NOT VALID C CODE */
Mặc dù vậy, như đã nhắc tới trước đây, nguyên lý trong cú pháp khai báo của C làm cho việc khai báo tương tự như việc sử dụng của biến. Thí dụ: một truy cập tới mảng này chẳng hạn như là
cat[i], lúc khai khai báo lại cũng có cú pháp dạng:
int cat[10];
Mảng của các mảng[sửa | sửa mã nguồn]
Tương tự như con trỏ, kiểu mảng có thể được lồng nhau. Vì trong cách viết mảng sử dụng các ngoặc vuông (
[]), là một cách viết hậu tố, nên kích cỡ của mảng bên trong thì được ghi ở bên ngoài (hay đằng sau):
double dog[5][12];
Câu lệnh trên khai báo rằng
dog là một mảng có năm phần tử. Mỗi phần tử là một mảng của 12 giá trị
double.
Mảng của các con trỏ[sửa | sửa mã nguồn]
Vì kiểu của phần trong một mảng tự nó lại là một kiểu của C, mảng của các con trỏ đương nhiên cũng có cấu trúc:
char *mice[10];
Câu lệnh này khai báo biến
mice là mảng của 10 phần tử, trong đó, mỗi phần tử là một con trỏ chỉ tới
char.
Con trỏ chỉ tới các mảng[sửa | sửa mã nguồn]
Để khai báo một biến là một con trỏ chỉ tới một mảng, nhất thiết phải dùng tới dấu ngoặc đơn. Nó tương tự như cách dùng ngoặc để đổi thứ tự ưu tiên cho phép toán (phép toán trong ngoặc sẽ được tính trước) chẳng hạn:
2 + 3 * 4 (2 + 3) * 4
Hoàn toàn tương tự cho con trỏ chỉ tới các mảng. Lưu ý rằng dấu ngoặc vuông (
[]) có độ ưu tiên cao hơn dấu sao (
*), do đó khai báo sẽ có dạng:
double (*elephant)[20];
Câu lệnh này khai báo biến
elephant là một con trỏ, và nó chỉ tới một mảng có 20 giá trị kiểu
double. Để khai báo một con trỏ chỉ tới dãy các con trỏ, chỉ cần kết hợp các cách viết:
int *(*crocodile)[15];
Hàm[sửa | sửa mã nguồn]
Một sự khai báo hàm là một thí dụ điển hình của một kiểu dẫn xuất. Bởi vì hàm có thể nhận vào các tham số, kiểu của mỗi tham số phải được ghi rõ ra. Tên của mỗi tham số không nhất thiết phải được cho trước khi khai báo một hàm. Hai cách khai báo sau đây là tương đương:
long bat(char); long bat(char c);
Tham số[sửa | sửa mã nguồn]
Trong khi cả hai dạng trên đều đúng cú pháp, thì cách viết bỏ qua tên của các tham số thường được xét như là một dạng tồi khi viết các khai báo hàm trong các tập tin tiêu đề. Các tên này có thể cung ứng các thông tin có giá trị cho những người đọc các tập tin đó chẳng hạn như là ý nghĩa và phép toán của chúng.
Các hàm có thể nhận và trả về các kiểu con trỏ dùng cách viết thông thường cho một con trỏ:
int const *ball(long int l, int i, unsigned char *s);
Kiểu đặc biệt
void hữu dụng cho việc khai báo các hàm mà chúng không có tham số nào cả:
char *wicket(void);
Điều này khác với một bộ tham số trống rỗng, được dùng trong ANSI C, để khai báo một hàm, nhưng không cho bất cứ thông tin nào về các kiểu tham số của nó.
double umpire();
Câu lệnh trên khai báo một hàm tên là
umpire, nó trả về một giá trị
double, nhưng không đề cập gì về các tham số mà hàm đó dùng tới.
Hàm nhận hàm khác làm tham số[sửa | sửa mã nguồn]
Trong C, các hàm không thể trực tiếp lấy các hàm khác như là tham số của nó, hay không thể trả về một hàm số như là kết quả. Mặc dù vậy, chúng có thể lấy vào hay trả về các con trỏ. Để khai báo rằng một hàm lấy một con trỏ hàm như là một tham số, thì dùng cách viết chuẩn như đã ghi ở trên.
int crowd(char p1, int (*p2)(void));
Khai báo bên trên có một hàm mà có hai tham số. Đối số đầu tiên,
p1, là một ký tự kiểu
char thông thường. Đối số còn lại,
p2 là một con trỏ chỉ tới một hàm. Hàm được chỉ tới này không (nên) có các tham số, và sẽ trả về một số nguyên
int.
Hàm trả về một hàm khác[sửa | sửa mã nguồn]
Để khai báo một hàm mà nó trả về một hàm khác phải dùng tới dấu ngoặc đơn, để thay thứ tự ưu tiên của các phép toán (về hàm)
long (*boundary(int height, int width))(int x, int y);
Như trên, có hai bộ danh sách tham số, sự khai báo này nên được đọc thật kĩ, vì nó không được rõ ràng. Ở đây, hàm
boundary được định nghĩa. Nó có hai tham số nguyên
height và
width, và trả về một con trỏ hàm. Con trỏ trả về này chỉ tới một hàm mà tự hàm đó có hai tham số nguyên là
x và
y, và trả về một số nguyên
long.
Cách này có thể được mở rộng tùy ý để làm cho các hàm trả về con trỏ chỉ tới hàm mà hàm đó lại trả về các con trỏ, mà các con trỏ này chỉ tới các hàm khác, và vân vân, nhưng việc này sẽ biến mã nguồn trở nên khó hiểu một cách nhanh chóng, và rất dễ phát sinh lỗi. Nếu thấy cần thiết làm chuyện đó, thì người lập trình nên cứu xét việc thiết kế lại hay dùng một cách định nghĩa kiểu
typedef.
Cấu trúc[sửa | sửa mã nguồn]
Cấu trúc (từ khóa tương ứng
struct) thực sự là một "kiểu mở rộng" của mảng. So với mảng thì cấu trúc mạnh hơn ở chỗ nó cho phép các phần tử của nó có các kiểu khác nhau và mỗi phần tử này được gọi là thành phần của một cấu trúc:
1 struct person 2 { 3 char name[60]; 4 int age; 5 }; //lưu ý dấu ";" cần dùng để kết thúc câu lệnh
Câu lệnh
struct nêu trên là một khai báo chuẩn để tạo ra một kiểu cấu trúc trong C.
Định nghĩa biến kiểu
struct[sửa | sửa mã nguồn]
Việc định nghĩa một biến có kiểu
struct cũng đơn giản như khi định nghĩa các biến bình thường:
struct person Bluesman; struct person Bio = {"Hieu", 30};
Trong cách đầu thì biến Bluesman chưa có giá trị khởi động (nó vẫn có thể được truy cập và thay đổi giá trị sau này) trong khi biến Bio đã được gán các giá trị ban đầu. Hãy lưu ý dùng dấu phẩy "
," để phân biệt các giá trị được gán lên những thành phần của cấu trúc—và dĩ nhiên chúng phải có đúng kiểu cũng như không thể gán thiếu các giá trị cho các thành phần này. Để truy cập đến các giá trị của biến có kiểu struct thì có thể dùng toán tử "." như câu lệnh sau:
printf("Name: %s\n", Bio.name);
Mảng của các
struct[sửa | sửa mã nguồn]
Để kiến tạo một mảng của các
struct thì dùng cú pháp sau:
struct person list[10];
Con trỏ chỉ tới
struct[sửa | sửa mã nguồn]
Cũng vậy, việc tiến hành khai báo một biến con trỏ có kiểu là
struct tương tự cách thông thường. Chỉ cần thêm vào đó dấu sao đằng trước tên biến:
struct person *Huong;
Cấu trúc lồng nhau[sửa | sửa mã nguồn]
Kiểu cấu trúc cũng có thể định nghĩa lồng vào nhau. Thí dụ dưới đây cho thấy việc khai báo cấu trúc
worker có chứa cấu trúc
person như là một thành phần. Việc truy cập dữ liệu thành phần của cấu trúc bên trong cũng được tiến hành theo cách dùng toán tử "." nối tiếp nhau.
1 struct person 2 { 3 char name[60]; 4 int age; 5 }; 6 7 struct worker 8 { 9 struct person peronal_ID; 10 char job[30]; 11 float income; 12 };
Kiểu hợp nhất[sửa | sửa mã nguồn]
Kiểu hợp nhất có tên từ khóa là
union kiểu đặc biệt này cho phép nó chứa dữ liệu mà có thể có kiểu khác nhau trong cùng một phần bộ nhớ (mà nó có thể được cấp phát khi khai báo biến):
1 union folder 2 { 3 int number; 4 double real; 5 char letter; 6 }; //lưu ý dấu ";" cần dùng để kết thúc câu lệnh
Để khai báo biến, có thể dùng cách thông thường, tạo mảng các
union hay cách tham chiếu:
union folder matter; union folder listtype[100]; union folder *matterptr;
Để gán hay truy cập giá trị cho một biến union, có thể dùng toán tử "." Theo hàng khai báo đầu tiên của thí dụ trên ta có thể viết một trong các phép gán:
matter.real = 3.1416;
hay là:
matter.letter = 't';
hay là:
matter.number = 1;
Lưu ý:
- Việc gán giá trị cho một biến kiểu
unionđòi hỏi kiểu của dữ liệu đó phải có mặt trong khai báo ban đầu của nó. Theo thí dụ trên thì kiểu
folderchỉ chấp nhận chứa một đơn vị dữ liệu của một trong ba kiểu
int, double,và
char.
- Một khi giá trị có kiểu đúng nào đó được gán cho một biến kiểu
unionthì nó sẽ xóa bỏ hẳn giá trị cũ (nếu có) mà biến này đã chứa trước đó.
- Việc truy cập một giá trị từ một biến kiểu
unioncần lưu ý đến kiểu hiện tại của dữ liệu đang được chứa của biến này nếu không, có thể gây ra lỗi dùng sai kiểu.
- Điểm khác nhau quan trọng giữa
unionvà
structlà
unionchỉ có được một thành phần (nhưng thành phần này phải có kiểu tùy theo khai báo của người lập trình) trong khi
structbao gồm nhiều thành phần (và mỗi thành phần có thể có kiểu khác nhau).
- Tương tự như
struct,
unioncho phép khai báo nhiều union lồng nhau.
Dùng
#define để định nghĩa hằng và kiểu[sửa | sửa mã nguồn]
Một cách tổng quát thì từ khóa tiền xử lý
#define đùng để định nghĩa tên của một kiểu (đối tượng) nào đó. Thực ra, câu lệnh
#define chỉ là một loại câu lệnh macro. Có hai ứng dụng chính như sau:
Định nghĩa tên hằng[sửa | sửa mã nguồn]
Có thể dùng câu lệnh tiền xử lý
#define để định nghĩa một hằng:
#define PI 3.14159 //định nghĩa tên một hằng số PI #define STANDARD "ANSI C" //định nghĩa tên một hằng dãy ký tự #define ESC '\033' //định nghĩa tên một hằng ký tự mã ASCII của phím Esc.
Lưu ý: so với cách định nghĩa dùng từ khóa
const thì cách dùng này không được uyển chuyển bằng nhưng nó thường cho hiệu quả thực thi nhanh hơn vì đây chỉ là các macro.
Định nghĩa tên của kiểu dữ liệu[sửa | sửa mã nguồn]
Có thể dùng
#define để định nghĩa tên của một kiểu dữ liệu:
#define real float //định nghĩa tên kiẻu real cho dữ liệu có kiểu float
Việc khai báo các biến không có gì khác lạ ngoại trừ tên mới được dùng:
real x, y[3], *z;
Lưu ý: Việc sử dụng
#define có thể có các hiệu ứng phụ không ngờ nếu dùng nó kết hợp với nhiều định tính và có thể dẫn đến những lỗi khó tìm khi viết mã:
#define STRING char *
Trong lúc định nghĩa biến người lập có thể muốn định nghĩa hai con trỏ
char như sau:
STRING name, job;
Tuy nhiên, điều ước muốn sẽ không xảy ra vì
#define là macro nên trình dịch sẽ diễn giải thành (nó chỉ thay thế tên
STRING bằng
char *):
char * name, job;
Và như vậy, người lập trình sẽ không nhận được hai biến con trỏ như dự tính mà chỉ có một biến
name là con trỏ mà thôi.
Dùng
typedef để định nghĩa kiểu[sửa | sửa mã nguồn]
Một cách khác để đặt tên riêng cho kiểu dữ liệu là dùng câu lệnh với từ khóa
typedef:
typedef float real;
Nếu so sánh cách viết trong thí dụ trên với việc dùng từ khoá
#define để định nghĩa thì chúng hoàn toàn tương đương (chỉ khác nhau về thứ tự các chữ
float và
real). Tuy nhiên, cách viết này là một sự thay thế thế tên "đúng nghĩa" chứ không phải là một macro đơn thuần. Trở lại thí dụ:
typedef char* string;
Câu lệnh trên cho phép đặt tên string như là một kiểu mới (mà nội dung của nó là kiểu con trỏ
char). Bây giờ hãy xét đến câu lệnh khai báo biến:
string name, job;
Trường hợp này sẽ được trình dịch diễn dịch đúng theo mong muốn thành:
char *name, *job;
Dùng cho
struct[sửa | sửa mã nguồn]
Một thí dụ khác liên quan đến việc đặt tên cho
struct là việc kết hợp cả hai khai báo và đặt tên lại trong cùng một câu lệnh:
1 typedef struct 2 { 3 char * name; 4 int * age; 5 } person;
Như vậy khi khai báo biến chỉ cần viết là:
person Trung;
Ứng dụng[sửa | sửa mã nguồn]
Một ứng dụng đáng lưu ý của
typedef là việc làm cho mã C trở nên linh hoạt hơn trong nhiều môi trường khác nhau. Thí dụ: khi muốn xác định dùng đúng 4 byte cho một kiểu nguyên nhưng trên một số hệ máy thì nó ứng với kiểu
int, trong khi trên một số hệ máy khác nó lại ứng với kiểu
long int. Để giải quyết việc dùng chính xác 4 byte cho kiểu nguyên mà người lập trình muốn, thì có thể dùng giải pháp là: thêm vào một tập tin bao gồm trong đó có chứa định nghĩa:
typedef int FOURBYTE; //dùng cho các máy lấy int là 4 byte
hay định nghĩa:
typedef long int FOURBYTE; //dùng cho các máy lấy long int là 4 byte
và chỉ cần thêm vào trong mã nguồn câu lệnh
#include <Tên_tập_tin_bao_gồm> như vậy chỉ cần thay nội dung của tập tin bao gồm thì toàn bộ mã vẫn hoạt động đúng.
Kiểu
enum[sửa | sửa mã nguồn]
Kiểu
enum là một kiểu dữ liệu đặc biệt được dùng để định nghĩa một quan hệ thứ tự cho một tập họp hữu hạn các tên. (Trong thực tế thì
enum có kiểu là
int Theo trang 553 trong cuốn "New C Primer Plus"—xem thêm phần tham khảo):
enum Wiki {Arisa, Bluesman, VietBio, Trung, Quang, Minh};
Để khai báo biến
member có kiểu
enum dùng câu lệnh:
enum member;
Các giá trị (hiểu ngầm) của cáo ký hiệu
Arisa, Bluesman, VietBio, Trung, Quang, Minh theo mặc định sẽ tương ứng với
0, 1, 2, 3, 4, 5. các cách viết câu lệnh sau đây là có hiệu lực:
1 member = Minh; 2 if(member == VietBio) 3 { 4 //do_some_commands 5 } 6 for(member = Arisa; member <= Trung; member++) 7 { 8 //do_some_commands 9 }
Như vậy, theo mặc đinh. các tên của một
enum được xem là các hằng số từ 0 tăng dần cho đến phần tử cuối cùng trong đó. Tuy nhiên, C không loại trừ khả năng đặt lại giá trị của một phần tử trong
enum theo cách riêng:
enum reordert = {duck, cat = 10, mouse = 50, elephant = 1000, lion, virus};
Trong ví dụ trên thì
duck có giá trị tương ứng là
0,
cat là
10,...,
elephant là
1000, còn
lion sẽ tương ứng là
1001 và
virus là
1002.
Một trong những ứng dụng chính của kiểu này là để tăng cường khả năng đọc mã được dễ hiểu hay phù hơn với con người.
Kiểu
FILE[sửa | sửa mã nguồn]
Kiểu
FILE là kiểu dữ liệu dùng để xử lý các tập tin. Theo ANSI thì có hai phương thức để truy cập là nhị phân
(binary) và văn bản
(text). Người ta dùng một biến con trỏ để khai bảo:
FILE *fp;
Thủ tục quan trọng cần làm tiếp theo là việc mở tập tin. Hàm thường được dùng để mở một tập tin là
fopen
fp = fopen ("Dung.txt", "r");
Trong dòng lệnh trên thì tập tin có tên
Dung.txt sẽ được mở trong chế độ đọc
r. Các chế độ truy cập cơ bản bao gồm:
r- đọc
w- viết
a- viết tiếp vào cuối tập tin và tạo tập tin mới nếu chưa có
r+- đọc và viết
w+- đọc và viết nhưng cắt bỏ nội dung cũ của tập tin nếu có, tạo tập tin mới nếu chưa có
a+- Mở file đã tồn tại với mục đích đọc và ghi. Nó tạo file mới nếu không tồn tại. Việc đọc file sẽ bắt đầu đọc từ đầu nhưng ghi file sẽ chỉ ghi vào cuối file.
rb
wb
ab
rb+
r+b
wb+
w+b
ab+
a+bgiống như các trường hợp trên nhưng chỉ dùng cho tập tin nhị phân.
Để tiếp tục việc xở lý thì có thể dùng tới các hàm trong thư viện chuẩn như:
getc(),
putc(),
fprintf(),
fscanf(),
fget(),
fgets(),
fputs(),
fseek(),
ftell() và hàm
fclose().
Lưu ý về biến được khai báo
static[sửa | sửa mã nguồn]
Các biến có được xác định bởi định tính
static đặt trước tên kiểu biến khi khai báo sẽ cho biến đó một tính năng đặc biệt, đó là, giá trị của nó sẽ được lưu giữ không bị mất đi mặc dù khối mã chứa nó đã được xử lý xong. Trường hợp. Đặc biệt nếu một biến được khai báo có định tính
static trong một hàm và được cài đặt giá trị nào đó thì sau khi hàm đó được gọi, giá trị của biến
static đó vẫn còn giữ nguyên giữa mỗi lần gọi (cho tới khi nó được gán giá trị khác trong lần gọi tới của hàm). Thi dụ sau đây khai báo biến
my_static có định tính
static trong một hàm:
1 #include<stdio.h> 2 int static_func(int init) 3 { 4 static int my_static_var; 5 my_static_var += init; 6 return my_static_var; 7 } 8 9 int main(void) 10 { 11 printf("call the 1st time (init=0), my_static_var = %d\n", static_func(0)); 12 printf("call the 2nd time (init=1), my_static_var = %d\n", static_func(1)); 13 printf("call the 3rd time (init=2), my_static_var = %d\n", static_func(2)); 14 }
sau khi dịch và chạy mã này sẽ cho kết quả:
call the 1st time (init=0), my_static_var = 0 //0 +0 =0 call the 2nd time (init=1), my_static_var = 1 //0 +1 =1 call the 3rd time (init=2), my_static_var = 3 //1 +2 =3
Lưu ý: Mọi biến toàn cục đều có định tính
static một cách tự động.
Xem thêm[sửa | sửa mã nguồn]
Tham khảo[sửa | sửa mã nguồn]
- New C Primer Plus. The Waite Group's. SAM Publishing. 1993. ISBN 0-672-30319-1

markdown:
# Kiểu và khai báo biến trong C
|Bài viết này
|cần thêm .
|
|
## Mục lục
[Ngôn ngữ lập trình C](/wiki/C_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)) có một hệ thống mở rộng cho việc **khai báo các biến của các kiểu khác nhau**. Những quy tắc dành cho các kiểu phức tạp có thể gây nhầm lẫn tùy theo các kiểu thiết kế của chúng. Bài này nói về các khai báo biến, bắt đầu từ các kiểu đơn giản, và dẫn tới các kiểu phức tạp hơn.
## Kiểu cơ bản[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=1) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=1)]
Có 4 kiểu cơ bản của các biến trong C; đó là:
char,
int,
double và
float.
|Tên kiểu||Ý nghĩa|
|
||Đơn vị cơ bản nhất có thể địa chỉ hóa được; nó là một byte. Đây là một kiểu nguyên.|
|
||Loại số nguyên theo kích cỡ tự nhiên nhất của các máy tính. Thông thường nó có thể lấy trọn một khoảng có thể địa chỉ hoá được của một
|
|
||Một giá trị dấu chấm động có độ chính xác đơn.|
|
||Một giá trị dấu chấm động có độ chính xác kép.|
Để khai báo một biến có kiểu cơ bản, tên của kiểu được ghi ra trước sau đó đến tên của biến mới (hay của nhiều biến mới cách phân cách nhau bởi dấu phẩy) -- (Xem thêm định nghĩa
[dãy điểm](/wiki/C%C3%BA_ph%C3%A1p_ng%C3%B4n_ng%E1%BB%AF_C#Th.E1.BB.A9_t.E1.BB.B1_.C4.91.C3.A1nh_gi.C3.A1))
char red; int blue, yellow;
Các
[định tính](/wiki/C%C3%BA_ph%C3%A1p_ng%C3%B4n_ng%E1%BB%AF_C#QUALIFIER) khác nhau có thể đặt vào trong các kiểu cơ bản này để điều chỉnh kích cỡ và sẽ được miêu tả trong phần sau. Lưu ý: Ở đây chỉ nêu ra trường hợp khai báo đơn giản không đi kèm với việc gán giá trị khởi động cho biến
### Dấu[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=2) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=2)]
Một kiểu được gọi là
**có dấu** nếu kiểu nguyên đó có thể chứa các số âm. Ngược lại các kiểu cơ bản nào không chấp nhận các số âm là kiểu **không dấu**.
Có hai kiểu nguyên là
char và
int có thể có dấu âm hoặc không. Theo mặc định thì mọi kiểu
int là có dấu (nghĩa là chúng chấp nhận các số âm). Để dùng dưới dạng không có dấu (tức là kiểu nguyên chỉ chấp nhận các sô không âm) thì từ khoá
unsigned phải được dùng. Ngoài ra, thay vì khai báo đầy đủ trong dạng
unsigned int, người ta có thể lược bỏ bớt từ khóa
int (và nó được xem như hiểu ngầm—điều này chỉ dùng được cho kiểu
int mà thôi). Như vậy hai khai báo sau đây hoàn toàn tương đương:
unsigned int green; unsigned green;
Đặc tả của C không xác định rõ ràng là kiểu
char sẽ là loại có dấu hay không dấu; khi đó, dấu của kiểu này tùy thuộc vào quy định của nhà phát hành trình dịch. Như vậy, một cách để giảm sai sót khi làm việc trên nhiều loại trình dịch C khác nhau là khai báo rõ ràng bằng các định tính
signed hay
unsigned nếu dùng kiểu
char để tính toán trên các con số. (Dù sao, nó thực sự sẽ không quá quan trọng nếu dùng kiểu
char như là kiểu "ký tự".)
unsigned char grey; signed char white;
Tiêu chuẩn chung yêu cầu
char,
signed char,
unsigned char là các kiểu khác nhau. Ngoài ra, các hàm chuẩn về dãy các ký tự sử dụng các con trỏ chỉ tới kiểu
char (không có định tính), nhiều trình dịch C sẽ bắt lỗi (hay cảnh cáo) nếu các kiểu ký tự khác được dùng như là dãy ký tự được chuyển vào các hàm này.
### Kích cỡ[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=3) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=3)] *Trong phần này hai cụm từ "chiếm" và "có độ dài" đều có nghĩa là "phần bộ nhớ cần thiết để dành cho một biến"; biến này có kiểu được miêu tả tùy theo chi tiết của bài viết*.
Kiểu
int cũng có các định tính về kích cỡ để đặc biệt hóa tầm rộng của giá trị mà kiểu này cho phép (tương ứng với đó là việc thay đổi phần bộ nhớ dùng để chứa các số có kiểu này).
short int yellow; long int orange;
Tương tự như đã đề cập trong phần trước, người ta có thể bỏ không viết từ khóa
int trong các kiểu mà đầy đủ phải viết là
short int or
long int. Thí dụ của hai khai báo sau đây là tương đương.
long int brown; long brown;
Có một số nhầm lẫn trong giới hiểu biết về C như là các kiểu nguyên có độ lớn bao nhiêu. Trong tiêu chuẩn thì không chỉ một cách rõ ràng việc này:
- Kiểu
short intkhông thể lớn hơn kiểu
int.
- Kiểu
intkhông thể lớn hơn
long int.
- Kiểu
short intphải dài ít nhất 16 bit.
- Kiểu
long intphải dài ít nhất 32 bit.
Trong tiêu chuẩn đã không đòi hỏi gì về các kích cỡ nêu trên và những khác nhau cần thiết. (Nghĩa là hoàn toàn hợp lệ nếu cả ba kiểu đều dài 64 bit!) Để có được một miêu tả chính xác và đơn giản của các kiểu, mỗi loại
[máy tính](/wiki/M%C3%A1y_t%C3%ADnh) người ta áp dụng vào trong mỗi kiểu (cũng như là kích cỡ của một kiểu con trỏ; xem phần đưới đây) một loại lược đồ đã được tạo ra; (xem: [64-Bit Programming Models](http://www.opengroup.org/public/tech/aspen/lp64_wp.htm)). Hai lược đồ được biết nhiều nhất là
-
ILP32, trong đó
int,
long intvà các kiểu con trỏ chiếm 32 bit.
LP64, trong đó,
long intvà con trỏ mỗi loại chiếm 64 bit, còn
intcó độ dài 32 bit.
-
Hầu hết các trình dịch dùng các lược đồ trên dùng 16 bit cho kiểu
short int.
Một biến
double có thể là một
long double, mà trình dịch có thể sử dụng thay cho một kiểu
double thuần túy. Tương tự tình huống trước, chuẩn C không hề nêu rõ các kích cỡ tương đối giữa các giá trị dấu chấm động, mà chỉ đòi hỏi
float không được lớn hơn
long double về kích cỡ.
### Từ khóa định tính
const cho các kiểu[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=4) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=4)]
Để giúp tăng cường độ an toàn trong các chương trình, các giá trị có thể được đánh dấu là các hằng bằng từ khóa định tính
const. Với từ khóa này thì một biến khai báo trở thành một hằng. Mọi thao tác do vô ý hay cố ý để điều chỉnh giá trị của nó sẽ bị báo lỗi bởi hầu hết các trình dịch. Bởi vì sau khi đã dùng từ khóa định tính
const thì các giá trị của biến không thể thay đổi nữa nên người lập trình phải gán giá trị ban đầu ngay lúc khai báo.
Chuẩn C cho phép hoán đổi vị trí của các hiệu chính. Thí dụ cả hai khai báo hằng sau đây là tương đương
int const black = 12; const int black = 12;
Cách khai báo đầu thường phản ánh cách dùng
const trong cách dùng kiểu con trỏ trong khi cách thứ nhì lại tự nhiên hơn và phổ dụng hơn.
## Con trỏ[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=5) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=5)]
Một biến có thể được khai báo như là một con trỏ chỉ đến các giá trị có kiểu nào đó, với ý nghĩa của dùng từ khóa định tính
***. Để khai báo chỉ việc viết thêm ngay trước tên biến một dấu sao:
char *square; long *circle;
Lưu ý: Nếu dùng nhiều hơn một dấu sao thì sẽ tạo nên dạng các con trỏ đứng trước chỉ vào con trỏ đứng sau và con trỏ cuối cùng mới chỉ đến địa chỉ của giá trị biến.
Trong cuốn "
*The C Programming Language*" (Ngôn ngữ lập trình C) có cho một giải thích tường tận về việc "hơi kì cục" khi dùng dấu sao trước tên của biến, trong khi dường như việc dùng dấu sao này đứng trước tên của kiểu thì có vẻ "hợp lý" hơn. Đó chính là việc [tham chiếu ngược](/w/index.php?title=Tham_chi%E1%BA%BFu_ng%C6%B0%E1%BB%A3c&action=edit&redlink=1) con trỏ, nó có kiểu của đối tượng mà nó chỉ tới. Trong thí dụ trên,
*circle là một
*giá trị* của kiểu
long. Trong khi điều này khó thấy rõ trong thí dụ trên, thì nó lại cho thấy ưu điểm nếu dùng trong các kiểu phức hợp. Đây là lý do tại sao C "hơi kì cục" trong cách khai báo các kiểu phức hợp, lúc đó, tên của biến sẽ không còn rõ ràng trong khi khai báo kiểu như các thí dụ sẽ nêu trong phần tiếp sau đây.
Có một kiểu đặc biệt của giá trị mà không thể dùng được trực tiếp như là biến có kiểu, nhưng lại có thể chỉ đến nó nếu khai báo con trỏ.
void *triangle;
Giá trị được chỉ tới ở đây không thể dùng trực tiếp được; mọi cố gắng để
[tham chiếu ngược](/w/index.php?title=Tham_chi%E1%BA%BFu_ng%C6%B0%E1%BB%A3c&action=edit&redlink=1) con trỏ này sẽ dẫn tới một lỗi. Sự tiện lợi ở đây là vì nó là một con trỏ "tổng quát"; nó hữu dụng khi làm việc trên dữ liệu mà kiểu được chỉ tới là không giữ vai trò gì quan trọng. Đơn giản chỉ cần cái địa chỉ con trỏ. Nó thường được ứng dụng để chứa các con trỏ trong các kiểu để làm tiện ích như là [danh sách liên kết](/w/index.php?title=Danh_s%C3%A1ch_li%C3%AAn_k%E1%BA%BFt&action=edit&redlink=1), bảng băm ( *hash*). Khi nào cần thì tiện ích sẽ [đổi kiểu](/w/index.php?title=%C4%90%E1%BB%95i_ki%E1%BB%83u&action=edit&redlink=1) ( *typecast*) thành con trỏ có kiểu cần dùng. Sau đây là thí dụ về các khai báo con trỏ hợp lệ:
long int *rectangle; unsigned short int *rhombus; const char *kite;
Lưu ý đặc biệt về việc dùng
const trong trường hợp cuối cùng: ở đây
kite là một con trỏ không phải là hằng chỉ tới một
const char (tức là nó chỉ tới là một hằng có kiểu ký tự). Giá trị của
kite tự nó không phải là hằng, chỉ có giá trị của
char mà nó chỉ tới là một hằng. hay nói ngắn gọn hơn thì con trỏ
kite có thể thay đổi để trỏ tới địa chỉ khác, nhưng giá trị tại địa chỉ mà con trỏ đang trỏ tới không thay đổi được. Vị trí của từ khoá
const đặt sau kiểu sẽ cho một cách thức để khai báo hằng con trỏ. Và như là một hằng, nó phải được gán giá trị khởi động khi khai báo:
char * const pentagon = &some_char;
Ở đây,
pentagon là một hằng con trỏ, mà nó chỉ tới một
char. Giá trị mà nó chỉ tới lại không là một hằng; và sẽ không gây lỗi khi thay đổi ký tự được nó chỉ tới. Chỉ khi nào thay đổi chính con trỏ này thì sẽ gây lỗi (vì đã khai báo nó là hằng). Cũng có thể khai báo cả hai: con trỏ và giá trị mà nó chỉ tới đều là hằng. Có hai cách tương đương nếu muốn khai báo như vậy là:
char const * const hexagon = &some_char; const char * const hexagon = &some_char;
### Con trỏ chỉ tới con trỏ[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=6) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=6)]
Vì lý do một khai báo chẳng hạn như
char * tự nó là một kiểu, nên một biến con trỏ có thể được khai báo để nó chỉ vào các giá trị có kiểu như vây. Nói gọn hơn, chúng là con trỏ chỉ tới các con trỏ. Thí dụ:
char **septagon;
Như đã đề cập phần trên các từ khóa định tính
const có thể áp dụng vào chẳng hạn:
unsigned long const int * const *octogon;
Dòng trên khai báo
octogon là một con trỏ chỉ tới một hằng con trỏ, và hằng con trỏ này trở lại chỉ tới một hằng số nguyên dạng
unsigned long. Các kiểu con trỏ có thể lồng nhau, nhưng chúng càng trở nên khó khăn để nghĩ tới việc sử dụng khi mà càng nhiều cấp độ của sự gián tiếp tham gia vào. Mọi mã dùng nhiều hơn hai cấp độ của con trỏ có thể sẽ cần tới một sự thiết kế, dạng
struct các con trỏ.
## Mảng[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=7) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=7)]
Đối với nhiều người lập trình, trong hầu hết các ngôn ngữ tương tự C, kiểu của một mảng nằm trong số phần tử mà nó chứa. Do vậy, khai báo sau đây có thể dùng trong các ngôn ngữ như
[Java](/wiki/Java_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)) hay [C#](/wiki/C_th%C4%83ng) để khai báo một mảng 10 giá trị số nguyên.
int[10] cat; /* THIS IS NOT VALID C CODE */
Mặc dù vậy, như đã nhắc tới trước đây, nguyên lý trong cú pháp khai báo của C làm cho việc khai báo tương tự như việc sử dụng của biến. Thí dụ: một truy cập tới mảng này chẳng hạn như là
cat[i], lúc khai khai báo lại cũng có cú pháp dạng:
int cat[10];
### Mảng của các mảng[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=8) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=8)]
Tương tự như con trỏ, kiểu mảng có thể được lồng nhau. Vì trong cách viết mảng sử dụng các ngoặc vuông (
[]), là một cách viết hậu tố, nên kích cỡ của mảng bên trong thì được ghi ở bên ngoài (hay đằng sau):
double dog[5][12];
Câu lệnh trên khai báo rằng
dog là một mảng có năm phần tử. Mỗi phần tử là một mảng của 12 giá trị
double.
### Mảng của các con trỏ[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=9) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=9)]
Vì kiểu của phần trong một mảng tự nó lại là một kiểu của C, mảng của các con trỏ đương nhiên cũng có cấu trúc:
char *mice[10];
Câu lệnh này khai báo biến
mice là mảng của 10 phần tử, trong đó, mỗi phần tử là một con trỏ chỉ tới
char.
### Con trỏ chỉ tới các mảng[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=10) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=10)]
Để khai báo một biến là một con trỏ chỉ tới một mảng, nhất thiết phải dùng tới dấu ngoặc đơn. Nó tương tự như cách dùng ngoặc để đổi thứ tự ưu tiên cho phép toán (phép toán trong ngoặc sẽ được tính trước) chẳng hạn:
2 + 3 * 4 (2 + 3) * 4
Hoàn toàn tương tự cho con trỏ chỉ tới các mảng. Lưu ý rằng dấu ngoặc vuông (
[]) có độ ưu tiên cao hơn dấu sao (
*), do đó khai báo sẽ có dạng:
double (*elephant)[20];
Câu lệnh này khai báo biến
elephant là một con trỏ, và nó chỉ tới một mảng có 20 giá trị kiểu
double. Để khai báo một con trỏ chỉ tới dãy các con trỏ, chỉ cần kết hợp các cách viết:
int *(*crocodile)[15];
## Hàm[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=11) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=11)]
Một sự khai báo hàm là một thí dụ điển hình của một
[kiểu dẫn xuất](/w/index.php?title=Ki%E1%BB%83u_d%E1%BA%ABn_xu%E1%BA%A5t&action=edit&redlink=1). Bởi vì hàm có thể nhận vào các tham số, kiểu của mỗi tham số phải được ghi rõ ra. Tên của mỗi tham số không nhất thiết phải được cho trước khi khai báo một hàm. Hai cách khai báo sau đây là tương đương:
long bat(char); long bat(char c);
### Tham số[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=12) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=12)]
Trong khi cả hai dạng trên đều đúng cú pháp, thì cách viết bỏ qua tên của các tham số thường được xét như là một dạng tồi khi viết các khai báo hàm trong các
[tập tin tiêu đề](/w/index.php?title=T%E1%BA%ADp_tin_ti%C3%AAu_%C4%91%E1%BB%81&action=edit&redlink=1). Các tên này có thể cung ứng các thông tin có giá trị cho những người đọc các tập tin đó chẳng hạn như là ý nghĩa và phép toán của chúng.
Các hàm có thể nhận và trả về các kiểu con trỏ dùng cách viết thông thường cho một con trỏ:
int const *ball(long int l, int i, unsigned char *s);
Kiểu đặc biệt
void hữu dụng cho việc khai báo các hàm mà chúng không có tham số nào cả:
char *wicket(void);
Điều này khác với một bộ tham số trống rỗng, được dùng trong ANSI C, để khai báo một hàm, nhưng không cho bất cứ thông tin nào về các kiểu tham số của nó.
double umpire();
Câu lệnh trên khai báo một hàm tên là
umpire, nó trả về một giá trị
double, nhưng không đề cập gì về các tham số mà hàm đó dùng tới.
### Hàm nhận hàm khác làm tham số[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=13) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=13)]
Trong C, các hàm không thể trực tiếp lấy các hàm khác như là tham số của nó, hay không thể trả về một hàm số như là kết quả. Mặc dù vậy, chúng có thể lấy vào hay trả về các con trỏ. Để khai báo rằng một hàm lấy một con trỏ hàm như là một tham số, thì dùng cách viết chuẩn như đã ghi ở trên.
int crowd(char p1, int (*p2)(void));
Khai báo bên trên có một hàm mà có hai tham số. Đối số đầu tiên,
p1, là một ký tự kiểu
char thông thường. Đối số còn lại,
p2 là một con trỏ chỉ tới một hàm. Hàm được chỉ tới này không (nên) có các tham số, và sẽ trả về một số nguyên
int.
### Hàm trả về một hàm khác[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=14) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=14)]
Để khai báo một hàm mà nó trả về một hàm khác phải dùng tới dấu ngoặc đơn, để thay thứ tự ưu tiên của các phép toán (về hàm)
long (*boundary(int height, int width))(int x, int y);
Như trên, có hai bộ danh sách tham số, sự khai báo này nên được đọc thật kĩ, vì nó không được rõ ràng. Ở đây, hàm
boundary được định nghĩa. Nó có hai tham số nguyên
height và
width, và trả về một con trỏ hàm. Con trỏ trả về này chỉ tới một hàm mà tự hàm đó có hai tham số nguyên là
x và
y, và trả về một số nguyên
long.
Cách này có thể được mở rộng tùy ý để làm cho các hàm trả về con trỏ chỉ tới hàm mà hàm đó lại trả về các con trỏ, mà các con trỏ này chỉ tới các hàm khác, và vân vân, nhưng việc này sẽ biến mã nguồn trở nên khó hiểu một cách nhanh chóng, và rất dễ phát sinh lỗi. Nếu thấy cần thiết làm chuyện đó, thì người lập trình nên cứu xét việc thiết kế lại hay dùng một cách định nghĩa kiểu
typedef.
## Cấu trúc[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=15) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=15)]
Cấu trúc (từ khóa tương ứng
struct) thực sự là một "kiểu mở rộng" của mảng. So với mảng thì cấu trúc mạnh hơn ở chỗ nó cho phép các phần tử của nó có các kiểu khác nhau và mỗi phần tử này được gọi là
**thành phần** của một cấu trúc:
1 struct person 2 { 3 char name[60]; 4 int age; 5 }; //lưu ý dấu ";" cần dùng để kết thúc câu lệnh
Câu lệnh
struct nêu trên là một khai báo chuẩn để tạo ra một kiểu cấu trúc trong C.
### Định nghĩa biến kiểu
struct[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=16) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=16)]
Việc định nghĩa một biến có kiểu
struct cũng đơn giản như khi định nghĩa các biến bình thường:
struct person Bluesman; struct person Bio = {"Hieu", 30};
Trong cách đầu thì biến Bluesman chưa có giá trị khởi động (nó vẫn có thể được truy cập và thay đổi giá trị sau này) trong khi biến Bio đã được gán các giá trị ban đầu. Hãy lưu ý dùng dấu phẩy "
," để phân biệt các giá trị được gán lên những thành phần của cấu trúc—và dĩ nhiên chúng phải có đúng kiểu cũng như không thể gán thiếu các giá trị cho các thành phần này. Để truy cập đến các giá trị của biến có kiểu struct thì có thể dùng toán tử "." như câu lệnh sau:
printf("Name: %s\n", Bio.name);
### Mảng của các
struct[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=17) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=17)]
Để kiến tạo một mảng của các
struct thì dùng cú pháp sau:
struct person list[10];
### Con trỏ chỉ tới
struct[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=18) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=18)]
Cũng vậy, việc tiến hành khai báo một biến con trỏ có kiểu là
struct tương tự cách thông thường. Chỉ cần thêm vào đó dấu sao đằng trước tên biến:
struct person *Huong;
### Cấu trúc lồng nhau[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=19) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=19)]
Kiểu cấu trúc cũng có thể định nghĩa lồng vào nhau. Thí dụ dưới đây cho thấy việc khai báo cấu trúc
worker có chứa cấu trúc
person như là một thành phần. Việc truy cập dữ liệu thành phần của cấu trúc bên trong cũng được tiến hành theo cách dùng toán tử "." nối tiếp nhau.
1 struct person 2 { 3 char name[60]; 4 int age; 5 }; 6 7 struct worker 8 { 9 struct person peronal_ID; 10 char job[30]; 11 float income; 12 };
## Kiểu hợp nhất[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=20) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=20)]
Kiểu hợp nhất có tên từ khóa là
union kiểu đặc biệt này cho phép nó chứa dữ liệu mà có thể có kiểu khác nhau trong cùng một phần bộ nhớ (mà nó có thể được cấp phát khi khai báo biến):
1 union folder 2 { 3 int number; 4 double real; 5 char letter; 6 }; //lưu ý dấu ";" cần dùng để kết thúc câu lệnh
Để khai báo biến, có thể dùng cách thông thường, tạo mảng các
union hay cách tham chiếu:
union folder matter; union folder listtype[100]; union folder *matterptr;
Để gán hay truy cập giá trị cho một biến union, có thể dùng toán tử "." Theo hàng khai báo đầu tiên của thí dụ trên ta có thể viết một trong các phép gán:
matter.real = 3.1416;
hay là:
matter.letter = 't';
hay là:
matter.number = 1;
Lưu ý:
- Việc gán giá trị cho một biến kiểu
unionđòi hỏi kiểu của dữ liệu đó phải có mặt trong khai báo ban đầu của nó. Theo thí dụ trên thì kiểu
folderchỉ chấp nhận chứa một đơn vị dữ liệu của một trong ba kiểu
int, double,và
char.
- Một khi giá trị có kiểu đúng nào đó được gán cho một biến kiểu
unionthì nó sẽ xóa bỏ hẳn giá trị cũ (nếu có) mà biến này đã chứa trước đó.
- Việc truy cập một giá trị từ một biến kiểu
unioncần lưu ý đến kiểu hiện tại của dữ liệu đang được chứa của biến này nếu không, có thể gây ra lỗi dùng sai kiểu.
- Điểm khác nhau quan trọng giữa
unionvà
structlà
unionchỉ có được một thành phần (nhưng thành phần này phải có kiểu tùy theo khai báo của người lập trình) trong khi
structbao gồm nhiều thành phần (và mỗi thành phần có thể có kiểu khác nhau)
*.*
- Tương tự như
struct,
unioncho phép khai báo nhiều union lồng nhau.
## Dùng
#define để định nghĩa hằng và kiểu[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=21) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=21)]
Một cách tổng quát thì từ khóa
[tiền xử lý](/wiki/Ti%E1%BB%81n_x%E1%BB%AD_l%C3%BD)
#define đùng để định nghĩa tên của một kiểu (đối tượng) nào đó. Thực ra, câu lệnh
#define chỉ là một loại câu lệnh
[macro](/wiki/Ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh#MACRO). Có hai ứng dụng chính như sau:
### Định nghĩa tên hằng[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=22) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=22)]
Có thể dùng câu lệnh tiền xử lý
#define để định nghĩa một hằng:
#define PI 3.14159 //định nghĩa tên một hằng số PI #define STANDARD "ANSI C" //định nghĩa tên một hằng dãy ký tự #define ESC '\033' //định nghĩa tên một hằng ký tự mã ASCII của phím Esc.
Lưu ý: so với cách định nghĩa dùng từ khóa
[ thì cách dùng này không được uyển chuyển bằng nhưng nó thường cho hiệu quả thực thi nhanh hơn vì đây chỉ là các macro. const](#T.E1.BB.AB_kh.C3.B3a_.C4.91.E1.BB.8Bnh_t.C3.ADnh_const_cho_c.C3.A1c_ki.E1.BB.83u)
### Định nghĩa tên của kiểu dữ liệu[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=23) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=23)]
Có thể dùng
#define để định nghĩa tên của một kiểu dữ liệu:
#define real float //định nghĩa tên kiẻu real cho dữ liệu có kiểu float
Việc khai báo các biến không có gì khác lạ ngoại trừ tên mới được dùng:
real x, y[3], *z;
Lưu ý: Việc sử dụng
#define có thể có các hiệu ứng phụ không ngờ nếu dùng nó kết hợp với nhiều định tính và có thể dẫn đến những lỗi khó tìm khi viết mã:
#define STRING char *
Trong lúc định nghĩa biến người lập có thể muốn định nghĩa hai con trỏ
char như sau:
STRING name, job;
Tuy nhiên, điều ước muốn sẽ không xảy ra vì
#define là macro nên trình dịch sẽ diễn giải thành (nó chỉ thay thế tên
STRING bằng
char *):
char * name, job;
Và như vậy, người lập trình sẽ không nhận được hai biến con trỏ như dự tính mà chỉ có một biến
name là con trỏ mà thôi.
## Dùng
typedef để định nghĩa kiểu[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=24) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=24)]
Một cách khác để đặt tên riêng cho kiểu dữ liệu là dùng câu lệnh với từ khóa
typedef:
typedef float real;
Nếu so sánh cách viết trong thí dụ trên với việc dùng từ khoá
#define để định nghĩa thì chúng hoàn toàn tương đương (chỉ khác nhau về thứ tự các chữ
float và
real). Tuy nhiên, cách viết này là một sự thay thế thế tên "đúng nghĩa" chứ không phải là một macro đơn thuần. Trở lại thí dụ:
typedef char* string;
Câu lệnh trên cho phép đặt tên string như là một kiểu mới (mà nội dung của nó là kiểu con trỏ
char). Bây giờ hãy xét đến câu lệnh khai báo biến:
string name, job;
Trường hợp này sẽ được trình dịch diễn dịch đúng theo mong muốn thành:
char *name, *job;
### Dùng cho
struct[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=25) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=25)]
Một thí dụ khác liên quan đến việc đặt tên cho
struct là việc kết hợp cả hai khai báo và đặt tên lại trong cùng một câu lệnh:
1 typedef struct 2 { 3 char * name; 4 int * age; 5 } person;
Như vậy khi khai báo biến chỉ cần viết là:
person Trung;
### Ứng dụng[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=26) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=26)]
Một ứng dụng đáng lưu ý của
typedef là việc làm cho mã C trở nên linh hoạt hơn trong nhiều môi trường khác nhau. Thí dụ: khi muốn xác định dùng đúng 4 byte cho một kiểu nguyên nhưng trên một số hệ máy thì nó ứng với kiểu
int, trong khi trên một số hệ máy khác nó lại ứng với kiểu
long int. Để giải quyết việc dùng chính xác 4 byte cho kiểu nguyên mà người lập trình muốn, thì có thể dùng giải pháp là: thêm vào một
[tập tin bao gồm](/wiki/C_(ng%C3%B4n_ng%E1%BB%AF_l%E1%BA%ADp_tr%C3%ACnh)#INCLUDE) trong đó có chứa định nghĩa:
typedef int FOURBYTE; //dùng cho các máy lấy int là 4 byte
hay định nghĩa:
typedef long int FOURBYTE; //dùng cho các máy lấy long int là 4 byte
và chỉ cần thêm vào trong mã nguồn câu lệnh
#include <Tên_tập_tin_bao_gồm> như vậy chỉ cần thay nội dung của tập tin bao gồm thì toàn bộ mã vẫn hoạt động đúng.
## Kiểu
enum[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=27) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=27)]
Kiểu
enum là một kiểu dữ liệu đặc biệt được dùng để định nghĩa một quan hệ thứ tự cho một tập họp hữu hạn các tên. (Trong thực tế thì
enum có kiểu là
int Theo trang 553 trong cuốn "New C Primer Plus"—xem thêm phần tham khảo):
enum Wiki {Arisa, Bluesman, VietBio, Trung, Quang, Minh};
Để khai báo biến
member có kiểu
enum dùng câu lệnh:
enum member;
Các giá trị (hiểu ngầm) của cáo ký hiệu
Arisa, Bluesman, VietBio, Trung, Quang, Minh theo mặc định sẽ tương ứng với
0, 1, 2, 3, 4, 5. các cách viết câu lệnh sau đây là có hiệu lực:
1 member = Minh; 2 if(member == VietBio) 3 { 4 //do_some_commands 5 } 6 for(member = Arisa; member <= Trung; member++) 7 { 8 //do_some_commands 9 }
Như vậy, theo mặc đinh. các tên của một
enum được xem là các hằng số từ 0 tăng dần cho đến phần tử cuối cùng trong đó. Tuy nhiên, C không loại trừ khả năng đặt lại giá trị của một phần tử trong
enum theo cách riêng:
enum reordert = {duck, cat = 10, mouse = 50, elephant = 1000, lion, virus};
Trong ví dụ trên thì
duck có giá trị tương ứng là
0,
cat là
10,...,
elephant là
1000, còn
lion sẽ tương ứng là
1001 và
virus là
1002.
Một trong những ứng dụng chính của kiểu này là để tăng cường khả năng đọc mã được dễ hiểu hay phù hơn với con người.
## Kiểu
FILE[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=28) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=28)]
Kiểu
FILE là kiểu dữ liệu dùng để xử lý các tập tin. Theo ANSI thì có hai phương thức để truy cập là nhị phân
(binary) và văn bản
(text). Người ta dùng một biến con trỏ để khai bảo:
FILE *fp;
Thủ tục quan trọng cần làm tiếp theo là việc mở tập tin. Hàm thường được dùng để mở một tập tin là
fopen
fp = fopen ("Dung.txt", "r");
Trong dòng lệnh trên thì tập tin có tên
Dung.txt sẽ được mở trong chế độ đọc
r. Các chế độ truy cập cơ bản bao gồm:
r- đọc
w- viết
a- viết tiếp vào cuối tập tin và tạo tập tin mới nếu chưa có
r+- đọc và viết
w+- đọc và viết nhưng cắt bỏ nội dung cũ của tập tin nếu có, tạo tập tin mới nếu chưa có
a+- Mở file đã tồn tại với mục đích đọc và ghi. Nó tạo file mới nếu không tồn tại. Việc đọc file sẽ bắt đầu đọc từ đầu nhưng ghi file sẽ chỉ ghi vào cuối file.
rb
wb
ab
rb+
r+b
wb+
w+b
ab+
a+bgiống như các trường hợp trên nhưng chỉ dùng cho tập tin nhị phân.
Để tiếp tục việc xở lý thì có thể dùng tới các hàm trong thư viện chuẩn như:
getc(),
putc(),
fprintf(),
fscanf(),
fget(),
fgets(),
fputs(),
fseek(),
ftell() và hàm
fclose().
## Lưu ý về biến được khai báo
static[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=29) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=29)]
Các biến có được xác định bởi định tính
static đặt trước tên kiểu biến khi khai báo sẽ cho biến đó một tính năng đặc biệt, đó là, giá trị của nó sẽ được lưu giữ không bị mất đi mặc dù khối mã chứa nó đã được xử lý xong. Trường hợp. Đặc biệt nếu một biến được khai báo có định tính
static trong một hàm và được cài đặt giá trị nào đó thì sau khi hàm đó được gọi, giá trị của biến
static đó vẫn còn giữ nguyên giữa mỗi lần gọi (cho tới khi nó được gán giá trị khác trong lần gọi tới của hàm). Thi dụ sau đây khai báo biến
my_static có định tính
static trong một hàm:
1 #include<stdio.h> 2 int static_func(int init) 3 { 4 static int my_static_var; 5 my_static_var += init; 6 return my_static_var; 7 } 8 9 int main(void) 10 { 11 printf("call the 1st time (init=0), my_static_var = %d\n", static_func(0)); 12 printf("call the 2nd time (init=1), my_static_var = %d\n", static_func(1)); 13 printf("call the 3rd time (init=2), my_static_var = %d\n", static_func(2)); 14 }
sau khi dịch và chạy mã này sẽ cho kết quả:
call the 1st time (init=0), my_static_var = 0 //0 +0 =0 call the 2nd time (init=1), my_static_var = 1 //0 +1 =1 call the 3rd time (init=2), my_static_var = 3 //1 +2 =3
Lưu ý: Mọi biến toàn cục đều có định tính
static một cách tự động.
## Xem thêm[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=30) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=30)]
## Tham khảo[
[sửa](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&veaction=edit§ion=31) | [sửa mã nguồn](/w/index.php?title=Ki%E1%BB%83u_v%C3%A0_khai_b%C3%A1o_bi%E1%BA%BFn_trong_C&action=edit§ion=31)]
- New C Primer Plus. The Waite Group's. SAM Publishing. 1993.
[ISBN 0-672-30319-1](/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:Ngu%E1%BB%93n_s%C3%A1ch/0672303191)

P3P: CP="This is not a P3P policy! See https://vi.wikipedia.org/wiki/%C4%90%E1%BA%B7c_bi%E1%BB%87t:CentralAutoLogin/P3P for more info."

X-Cache-Status: hit

Set-Cookie: GeoIP=US:VA:Ashburn:39.05:-77.47:v4; Path=/; secure; Domain=.wikipedia.org

Content-Type: text/html; charset=UTF-8

X-Cache: cp1068 hit/1, cp1066 miss

X-Content-Type-Options: nosniff

Via: 1.1 varnish-v4, 1.1 varnish-v4

Accept-Ranges: bytes

X-UA-Compatible: IE=Edge

Cache-Control: private, s-maxage=0, max-age=0, must-revalidate

Vary: Accept-Encoding,Cookie,Authorization

Content-Language: vi

Link: </static/images/project-logos/viwiki.png>;rel=preload;as=image;media=not all and (min-resolution: 1.5dppx),</static/images/project-logos/viwiki-1.5x.png>;rel=preload;as=image;media=(min-resolution: 1.5dppx) and (max-resolution: 1.999999dppx),</static/images/project-logos/viwiki-2x.png>;rel=preload;as=image;media=(min-resolution: 2dppx)


text:
Sputnik Việt Nam
Toàn bộ bài xuất bản
Đăng nhập
Đăng ký
Đăng xuất
00:28
17 Tháng Tám 2017
Trang chủ
Thế giới
Việt Nam
Hợp tác Nga-Việt
Chính trị
Kinh doanh
Xã hội
Vũ khí
Quan điểm-Ý kiến
Đa phương tiện
Nga
Hoa Kỳ
Châu Âu
Châu Á
Cận Đông
Khoa học
Văn hóa
Thể thao
Đời sống
Ảnh
Đồ họa thông tin
Biếm họa
Hà Nội
+
25°C
Matxcơva
+
21°C
Tìm kiếm
C919
1
Results
Mới nhất
Phổ biến
Thảo luận
17:27 05.05.2017
0
248
Trung Quốc cho đối thủ cạnh tranh với máy bay Nga MC-21 cất cánh lần đầu (Video, ảnh)
BẮC KINH (Sputnik) – Chiếc máy bay chở khách nội địa đường dài đầu tiên của Trung Quốc C919 bắt đầu chuyến bay thử nghiệm thứ nhất, - theo phóng sự trực tuyến phát trên Truyền hình Trung ương Trung Quốc (CCTV).
Tin tức mới
Mới nhất
Đọc nhiều nhất
Thảo luận nhiều nhất
23:58
Nhà gỗ Nga dành cho người dân Syria
23:36
Kiev mở cuộc điều tra thông tin về động cơ tên lửa Ukraina được sử dụng ở Bắc Triều Tiên
22:54
Mỹ đào tạo nhân viên tình báo cho Ukraina để hoạt động ở Donbass
22:18
Nữ MC gợi tình nhất quả đất đốt mắt dân mạng (Ảnh)
21:56
BNG Nga: Mỹ cung cấp chất độc hóa học vào Syria "dưới vỏ bọc hình ảnh trẻ em thiệt mạng"
Toàn bộ tin tức
Tổng Bí thư Nguyễn Phú Trọng: “Hôm qua là anh hùng nhưng biết đâu hôm nay là tội phạm”
2889
Vụ Trịnh Xuân Thanh trên báo chí Đức: Một người Việt làm việc cho chính phủ bị điều tra
2266
CBC: nhà sản xuất pho-mát Nga xin phương Tây thêm 10 năm trừng phạt
1531
Bước đi quyết định trên con đường làm trong sạch cán bộ của Việt Nam
1338
Bắc Kinh đang sử dụng lực lượng “dân quân biển” để tấn công đảo Thị Tứ của VN?
1005
Toàn bộ tin tức
Nga có thể gỡ “quả mìn biên giới” giữa Trung Quốc và Ấn Độ
4
Vì sao người Việt trẻ lười biếng và ích kỷ?
3
Báo Ý nói về "Vị trí của Việt Nam trong Thế kỷ châu Á"
3
Choáng với những chuyến du lịch xa xỉ của 'hội con nhà giàu Việt'
2
Nhà báo VN: Trong Đảng nảy nòi nhiều "sứ quân" thì nguy cơ khó còn là Đảng Cộng sản nữa!
2
Toàn bộ tin tức
Đa phương tiện
Ảnh
Biếm họa
Đồ họa thông tin
Chuẩn bị cho lễ khai mạc Diễn đàn quân sự-kỹ thuật quốc tế "Quân đội 2017"
Hàng từ Ukraina cho chú Kim
Chiến đấu cơ Su-33
Tìm chúng tôi
Facebook
Twitter
vn.sputnik
@sputnik_vn
Đăng ký
E-mail:
Tên hiển thị
Mật khẩu
Nhắc lại mật khẩu
Nhập mã hiệu với hình vẽ
Đăng nhập
Chính sách quyền riêng tư
Nhấn vào nút "Đăng ký" khẳng định Bạn đồng ý cho xử lý dữ liệu cá nhân và chấp nhận Chính sách riêng tư.
Đăng ký
* Những mục này nhất định phải điền đầy đủ
Để tiếp tục xin vui lòng xác nhận e-mail của bạn.Hướng dẫn xác nhận đã được gửi đến
Được
Khôi phục mật khẩu
Địa chỉ e-mail:
Nhập mã hiệu với hình vẽ
Khôi phục
Đăng nhập
Chính sách quyền riêng tư
Thành công! Hướng dẫn khôi phục mật khẩu của bạn đã được gửi trong e-mail
Được
Đăng ký
Bạn có tài khoản trên vn.sputniknews.com chưa?
Có
Không
Đăng ký
Xin chào!
E-mail
Mật khẩu
Ghi nhớ tôi
Nhập
Tôi không có tài khoản trên vn.sputniknews.com
Đăng ký
Quên mật khẩu?
Chính sách quyền riêng tư
Được
Đăng ký
Xin chào!
E-mail
Tên hiển thị
Tiếp theo
Đăng nhập
Tôi có tài khoản trên vn.sputniknews.com
Được
Xóa tài khoản
Bạn chắc chắn muốn xóa tài khoản của bạn trên vn.sputniknews.com?
Có
Không
Tài khoản của bạn đã bị xóa! Bạn có thể khôi phục lại tài khoản của bạn trong vòng 30 ngày bằng cách làm theo các liên kết được gửi đến địa chỉ e-mail mà bạn đã nhập lúc đăng ký.
Đóng
Tiêu chuẩn cộng đồng
Việc đăng ký và cấp phép cho Người sử dụng trên các trang web của Sputnik với tài khoản người sử dụng hoặc tài khoản trên mạng xã hội đồng nghĩa với việc chấp nhận các quy tắc.
Người sử dụng có nghĩa vụ không vi phạm luật pháp quốc gia và quốc tế. Người sử dụng có trách nhiệm lịch sự với những người khác tham gia thảo luận, độc giả và các cá nhân được nhắc đến trong các bài viết.
Quản trị trang có quyền xóa các bình luận bằng ngôn ngữ khác với ngôn ngữ chứa nội dung chính của bài viết.
Bình luận do Người sử dụng đăng lên tất cả các trang web sputniknews.com bằng các ngôn ngữ khác nhau đều qua biên tập.
Bình luận của Người sử dụng sẽ bị xóa nếu:
Không tương ứng với chủ đề bài viết được bình luận;
Kích động thù địch và phân biệt chủng tộc, dân tộc, giới tính, tôn giáo, phân biệt đối xử xã hội, vi phạm các quyền của người thiểu số;
Vi phạm quyền của trẻ vị thành niên, khiến họ tổn hại dưới mọi hình thức, bao gồm cả về mặt tinh thần;
Chứa đựng những ý tưởng mang tính cực đoan và khủng bố, kêu gọi mọi hoạt động bất hợp pháp khác;
Chứa đựng những lời lăng mạ, đe dọa Người sử dụng khác, các cá nhân hoặc tổ chức cụ thể, xúc phạm danh dự, nhân phẩm, phá hoại uy tín của họ;
Chứa đựng những lời lăng mạ hoặc tin nhắn bày tỏ sự thiếu tôn trọng đối với Sputnik;
Vi phạm quyền riêng tư, phổ biến dữ liệu cá nhân, tiết lộ bí mật thư tín của bên thứ ba mà không có sự đồng ý của họ;
Chứa đựng mô tả hoặc đường dẫn về cảnh bạo lực, tàn ác với động vật;
Chứa đựng thông tin về các biện pháp tự tử, xúi giục tự tử;
Theo đuổi các mục tiêu thương mại, chứa quảng cáo không phù hợp, quảng cáo chính trị bất hợp pháp hoặc nối kết đến các nguồn tài nguyên trực tuyến khác có chứa thông tin đó;
Quảng bá sản phẩm hoặc dịch vụ của bên thứ ba mà không có sự cho phép thích hợp;
Chứa đựng ngôn ngữ gây khó chịu hoặc thô tục và các phiên bản của nó, cũng như gợi ý về việc sử dụng các hạng mục từ vựng thuộc dạng này;
Chứa thư rác quảng cáo spam, dịch vụ gửi thư hàng loạt và các nguồn lực cho việc kiếm tiền trên mạng Internet;
Thúc đẩy sử dụng các loại thuốc gây nghiện, cung cấp thông tin về sản xuất và sử dụng các loại thuốc đó;
Liên kết với các virus và phần mềm độc hại;
Là thành phần của hành động, dẫn đến khối lượng lớn các bình luận giống nhau hoặc nội dung tương tự ("flashmob");
Tác giả lạm dụng viết số lượng lớn các tin ngắn ít nội dung hoặc ý nghĩa của văn bản rất khó hoặc không thể nắm bắt ("flood");
Tác giả vi phạm nghi thức, thể hiện hành vi có tính hung hăng, làm nhục và lăng mạ (""trolling"");
Tác giả thiếu tôn trọng ngôn ngữ, ví dụ, văn bản được viết hoàn toàn bằng chữ in hoa hoặc không chấm câu.
Quản trị trang có quyền chặn truy cập mà không cần thông báo trước hoặc xóa các tài khoản trong trường hợp Người sử dụng vi phạm các quy định về bình luận hay bị Người sử dụng khác phát hiện đã vi phạm.
Người sử dụng có thể khôi phục quyền truy cập tài khoản/mở khóa truy cập bằng cách viết thư theo địa chỉ e-mail:
moderator.vn@sputniknews.com
Bức thư phải bao gồm:
Chủ đề - Khôi phục hồi tài khoản/mở khóa truy cập
Tài khoản người sử dụng
Giải thích hành động vi phạm các quy tắc khiến cho tài khoản bị khóa.
Nếu nhóm phụ trách xét thấy có thể khôi phục lại quyền truy cập /mở khóa tài khoản, điều đó sẽ được thực hiện.
Trong trường hợp lặp lại vi phạm các quy tắc và bị tái khóa, quyền truy cập của Người sử dụng sẽ không thể được phục hồi, trong trường hợp này tài khoản sẽ bị khóa vĩnh viễn.
Để liên hệ với nhóm phụ trách, hãy sử dụng địa chỉ e-mail
moderator.vn@sputniknews.com
Đăng nhập
E-mail
Mật khẩu
Ghi nhớ tôi
Nhập
Đăng ký
Quên mật khẩu?
Chính sách quyền riêng tư
Cách khác để đăng nhập:
Được
Người sử dụng có nghĩa vụ không vi phạm luật pháp quốc gia và quốc tế. Người sử dụng có trách nhiệm lịch sự với những người khác tham gia thảo luận, độc giả và các cá nhân được nhắc đến trong các bài viết.
Quản trị trang có quyền xóa các bình luận bằng ngôn ngữ khác với ngôn ngữ chứa nội dung chính của bài viết.
Bình luận do Người sử dụng đăng lên tất cả các trang web sputniknews.com bằng các ngôn ngữ khác nhau đều qua biên tập.
Bình luận của Người sử dụng sẽ bị xóa nếu:
Người sử dụng có thể khôi phục quyền truy cập tài khoản/mở khóa truy cập bằng cách viết thư theo địa chỉ e-mail: moderator.vn@sputniknews.com
Bức thư phải bao gồm:
Trong trường hợp lặp lại vi phạm các quy tắc và bị tái khóa, quyền truy cập của Người sử dụng sẽ không thể được phục hồi, trong trường hợp này tài khoản sẽ bị khóa vĩnh viễn.
Để liên hệ với nhóm phụ trách, hãy sử dụng địa chỉ e-mail moderator.vn@sputniknews.com

WARC-Truncated: length

Cache-Control: public


text:
Stt, Status, những câu nói buồn về tình yêu tan vỡ đau khổ khi chia tay người yêu cho những ai đang buồn là những câu nói hay thể hiện tâm trạng đau khổ, khi phải rời xa và chia tay người mình yêu. Một tình yêu đẹp là một tình yêu có một cái kết có hậu, là hai người yêu thương nhau sẽ được gắn bó với nhau suốt đời.
Và chắc hẳn không ai trong chúng ta là không mong muốn cho mình có được một tình yêu đẹp và đúng nghĩa. Nhưng cuộc đời đôi khi không theo ý muốn của con người. Càng khao khát có được một tình yêu đẹp thì ta lại càng thất vọng càng nhiều. Cái mà ta nhận được đó là một tình yêu tan vỡ, và đau khổ. Những câu nói hay về tình yêu tan vỡ cho những ai đang buồn là những câu nói thể hiện tâm trạng đau khổ, khi phải rời xa và chia tay người mình yêu. Mời bạn cùng tham khảo và cảm nhận những câu nói hay về tình yêu tan vỡ sau đây nhé.
1. Tôi không trách ai đó vì đã làm tôi thất vọng.
Mà chỉ trách bản thân tôi đã hy vọng từ họ… quá nhiều!
2. Yêu thì hạnh phúc…
…Mà kết thúc thì đau…
Tự khóc tự lau…
…Tự đau tự chịu.
Tự gặp – tự hiểu – tự buông lơi.
Nước mắt tự rơi tự lau lấy.
Tự nhìn – tự thấy – tự biết đi.
Tự nghĩ – tự suy – tự quên đi.
Và… tự sống tiếp!
3. Niềm tin cũng giống như một cục tẩy vậy
Nó càng ngày càng nhỏ đi sau mỗi lần lầm lỗi.
4. Buồn làm gì cho đời chán nản
Khóc làm gì cho lệ chứa chan
Chán làm gì cho lý tưởng tiêu tàn
Hãy vững vàng và quên đi tất cả.
5. Yêu một người thật ra cần rất nhiều can đảm
– Can đảm để Chấp nhận
– Can đảm để Níu giữ
– Can đảm để Tha thứ
– Can đảm để Yêu thương
– Và… đôi khi cần…
– Can đảm để Buông tay.
6. Anh à..
Em khóc nhé..
Một chút thôi..
Khóc mệt em sẽ ngủ..
Và..
Tỉnh dậy em sẽ quên..
7. Cái gì đã vỡ là vỡ,
Có hàn gắn lại cũng chỉ toàn rạn nứt mà thôi.
Cái gì đã đứt là đứt,
Có nối lại cũng chẳng tồn tại dài lâu.
8. Vẫn biết rằng.. quá khứ ở đằng sau
và phải sống cho những gì phía trước
Nhưng đôi khi.. đôi chân vẫn bước ngược
Dẫn ta về tìm kiếm những nỗi đau.
9. Cuộc sống…
không phải lúc nào cũng màu hồng.
Muốn thấy cầu vồng..
Phải biết chấp nhận những cơn mưa!
10. Cuộc tình tan vỡ không thể đổ lỗi cho một ai…… Vì đó là cái sai của cả hai người.. Chỉ một cử chỉ, một hành động nhỏ thôi cũng đủ châm ngòi cho một tình yêu hết hạn.
Sưu tầm những câu nói hay về tình yêu tan vỡ buồn.. thật buồn..!!
11. Trong câu chuyện của người khác..
– Em luôn là người mạnh mẽ..
– Luôn an ủi và tìm hướng đi cho họ.
Nhưng ai đâu biết rằng..:
– Em luôn bất lực..
– Trong chính câu chuyện của bản thân mình..!!
12. Thời gian thay đổi.. nên Tình Cảm con người cũng đã đổi thay…
13.
Anh cho em chữ “Đợi”
Để em biết đánh vần chữ “Đau”
Nhưng về sau……………….
Anh sẽ phải mất rất lâu….
Để hiểu sâu về chữ “Tiếc”!
14. Đôi lúc nước mắt trở nên đáng quý hơn cả một nụ cười.
NỤ CƯỜI có thể tặng cho bất kỳ ai, nhưng NƯỚC MẮT thì chỉ dành cho những người mà ta không muốn mất.
15. Đôi khi chúng ta phải chấp nhận việc QUÊN đi một số người trong QUÁ KHỨ. Bởi vì một lý do đơn giản “họ không thuộc về TƯƠNG LAI của chúng ta”.
16. Cà phê đắng – bỏ đường thì ngọt.
Tình đắng rồi – bỏ cuộc là xong!
17. Khi người ta có tình yêu mới…
Thì ít ai nhìn lại… phía sau…
Để lau nước mắt cho người… ở lại…
Yêu đâu phải nói quên… là quên được!
Nếu người mình yêu được hạnh phúc thì họ sẽ thấy hạnh phúc.
Nhưng thử hỏi mấy ai được vui.. khi người làm họ vui… không còn bên họ nữa!
19. Sự thật là chúng ta luôn cảm thấy khó chịu khi mà…. có một ai đó…………. giành lấy người mà chúng ta yêu thương! Ngay cả khi họ không còn thuộc về chúng ta nữa.
20.
– Nụ cười tắt – Nước mắt lên ngôi
– Niềm tin chìm – Yêu thương vỡ
– Cảm xúc dần trôi – Con tim bật khóc
– Khi học được cách “Chấp nhận”
là lúc “Cảm xúc” bắt đầu nhạt..
..Và..
– Thất lạc luôn cả “Niềm tin”.
21.
.. Nụ cười ngây ngô Em đánh mất trong dòng đời hối hả..
.. Nụ cười giả tạo Em nhặt được từ xã hội bon chen..
.. Và phải chăng Em đang cố gắng cười..
.. Để trở thành một người.. Không.. Dám.. Khóc..!!?
22. Niềm tin vỡ rồi………. nhặt lại làm gì cho xước nữa bàn tay.
23.
Chuyện tình cảm vô cùng rắc rối.
Đôi khi chúng ta là bạn.
Đôi khi chúng ta là một cặp đôi.
Và đôi khi chúng ta chẳng khác gì.. những người xa lạ.
24. Cảm ơn ai đó vì sự vô tâm hời hợt… để tôi biết rằng mình cần DỪNG LẠI ở đâu.
25. Đôi khi.. chỉ là khoảng trống của một người để lại. Mà cho dù.. có cả thế giới.. vẫn không thể lấp đầy..!!!!
26. Rất ít người…
…có thể cười 2 lần..
..cho cùng một câu chuyện cười.
Nhưng đa số mọi người….lại khóc rất nhiều lần..
..cho cùng một nỗi đau!
27. Tại sao những lúc giận nhau,
– Chúng ta cứ nghĩ đến hai chữ….. CHIA TAY…..
– Mà không hề nghĩ đến hai chữ….. VƯỢT QUA…..
Để rồi…….
– Chúng ta cứ vô tình làm đau nhau..
– Làm tổn thương nhau nhiều đến thế!….
28. Em cần:
Một chút thờ ơ để không còn quan tâm đến một người không đáng.
Một chút lạnh lùng để có thể ngẩng cao đầu mà bước qua anh.
Một chút tàn nhẫn để gạt bỏ đi quá khứ.
Một chút lạc quan để một lần nữa vững tin vào tình yêu.
Và……
Một chút mạnh mẽ để cho những giọt nước mắt không rơi.
Cuộc sống là vậy đó có buồn thì mới có vui, có giận hờn, chia tay thì mới có những phút giây hạnh phúc, sum vầy. Bạn đã tìm thấy những câu nói hay về tình yêu tan vỡ phù hợp với tâm trạng của bạn chưa? Hy vọng Status, những câu nói buồn về tình yêu tan vỡ đau khổ khi chia tay sẽ có thể chia sẻ với bạn một chút về những nỗi niềm, cho bạn cảm giác đồng cảm. Rồi mọi chuyện cũng sẽ tan đi, và hãy cho quá khứ ngủ yên trong trái tim để tìm kiếm và đón nhận cho mình một tình yêu mới nhé. Đừng quên ghé Vui5s.net ủng hộ chúng tôi mỗi ngày và khám phá nhiều điều hay các bạn nhé!!!
Nguồn: Nhungloinoihay.net

markdown:
**Stt, Status, những câu nói buồn về tình yêu tan vỡ đau khổ khi chia tay người yêu cho những ai đang buồn là những câu nói hay thể hiện tâm trạng đau khổ, khi phải rời xa và chia tay người mình yêu. Một tình yêu đẹp là một tình yêu có một cái kết có hậu, là hai người yêu thương nhau sẽ được gắn bó với nhau suốt đời. **
Và chắc hẳn không ai trong chúng ta là không mong muốn cho mình có được một tình yêu đẹp và đúng nghĩa. Nhưng cuộc đời đôi khi không theo ý muốn của con người. Càng khao khát có được một tình yêu đẹp thì ta lại càng thất vọng càng nhiều. Cái mà ta nhận được đó là một tình yêu tan vỡ, và đau khổ. Những
[câu nói hay]( https://vui5s.net/status-hay) về tình yêu tan vỡ cho những ai đang buồn là những câu nói thể hiện tâm trạng đau khổ, khi phải rời xa và chia tay người mình yêu. Mời bạn cùng tham khảo và cảm nhận những [câu nói hay](https://vui5s.net/status-hay) về tình yêu tan vỡ sau đây nhé.
1. Tôi không trách ai đó vì đã làm tôi thất vọng.
Mà chỉ trách bản thân tôi đã hy vọng từ họ… quá nhiều!
2. Yêu thì hạnh phúc…
…Mà kết thúc thì đau…
Tự khóc tự lau…
…Tự đau tự chịu.
Tự gặp – tự hiểu – tự buông lơi.
Nước mắt tự rơi tự lau lấy.
Tự nhìn – tự thấy – tự biết đi.
Tự nghĩ – tự suy – tự quên đi.
Và… tự sống tiếp!
3. Niềm tin cũng giống như một cục tẩy vậy
Nó càng ngày càng nhỏ đi sau mỗi lần lầm lỗi.
4. Buồn làm gì cho đời chán nản
Khóc làm gì cho lệ chứa chan
Chán làm gì cho lý tưởng tiêu tàn
Hãy vững vàng và quên đi tất cả.
5. Yêu một người thật ra cần rất nhiều can đảm
– Can đảm để Chấp nhận
– Can đảm để Níu giữ
– Can đảm để Tha thứ
– Can đảm để Yêu thương
– Và… đôi khi cần…
– Can đảm để Buông tay.
6. Anh à..
Em khóc nhé..
Một chút thôi..
Khóc mệt em sẽ ngủ..
Và..
Tỉnh dậy em sẽ quên..
7. Cái gì đã vỡ là vỡ,
Có hàn gắn lại cũng chỉ toàn rạn nứt mà thôi.
Cái gì đã đứt là đứt,
Có nối lại cũng chẳng tồn tại dài lâu.
8. Vẫn biết rằng.. quá khứ ở đằng sau
và phải sống cho những gì phía trước
Nhưng đôi khi.. đôi chân vẫn bước ngược
Dẫn ta về tìm kiếm những nỗi đau.
9. Cuộc sống…
không phải lúc nào cũng màu hồng.
Muốn thấy cầu vồng..
Phải biết chấp nhận những cơn mưa!
10. Cuộc tình tan vỡ không thể đổ lỗi cho một ai…… Vì đó là cái sai của cả hai người.. Chỉ một cử chỉ, một hành động nhỏ thôi cũng đủ châm ngòi cho một tình yêu hết hạn.
*Sưu tầm những câu nói hay về tình yêu tan vỡ buồn.. thật buồn..!!*
11. Trong câu chuyện của người khác..
– Em luôn là người mạnh mẽ..
– Luôn an ủi và tìm hướng đi cho họ.
Nhưng ai đâu biết rằng..:
– Em luôn bất lực..
– Trong chính câu chuyện của bản thân mình..!!
12. Thời gian thay đổi.. nên Tình Cảm con người cũng đã đổi thay…
13.
Anh cho em chữ “Đợi”
Để em biết đánh vần chữ “Đau”
Nhưng về sau……………….
Anh sẽ phải mất rất lâu….
Để hiểu sâu về chữ “Tiếc”!
14. Đôi lúc nước mắt trở nên đáng quý hơn cả một nụ cười.
NỤ CƯỜI có thể tặng cho bất kỳ ai, nhưng NƯỚC MẮT thì chỉ dành cho những người mà ta không muốn mất.
15. Đôi khi chúng ta phải chấp nhận việc QUÊN đi một số người trong QUÁ KHỨ. Bởi vì một lý do đơn giản “họ không thuộc về TƯƠNG LAI của chúng ta”.
16. Cà phê đắng – bỏ đường thì ngọt.
Tình đắng rồi – bỏ cuộc là xong!
17. Khi người ta có tình yêu mới…
Thì ít ai nhìn lại… phía sau…
Để lau nước mắt cho người… ở lại…
Yêu đâu phải nói quên… là quên được!
Nếu người mình yêu được hạnh phúc thì họ sẽ thấy hạnh phúc.
Nhưng thử hỏi mấy ai được vui.. khi người làm họ vui… không còn bên họ nữa!
19. Sự thật là chúng ta luôn cảm thấy khó chịu khi mà…. có một ai đó…………. giành lấy người mà chúng ta yêu thương! Ngay cả khi họ không còn thuộc về chúng ta nữa.
20.
– Nụ cười tắt – Nước mắt lên ngôi
– Niềm tin chìm – Yêu thương vỡ
– Cảm xúc dần trôi – Con tim bật khóc
– Khi học được cách “Chấp nhận”
là lúc “Cảm xúc” bắt đầu nhạt..
..Và..
– Thất lạc luôn cả “Niềm tin”.
21.
.. Nụ cười ngây ngô Em đánh mất trong dòng đời hối hả..
.. Nụ cười giả tạo Em nhặt được từ xã hội bon chen..
.. Và phải chăng Em đang cố gắng cười..
.. Để trở thành một người.. Không.. Dám.. Khóc..!!?
22. Niềm tin vỡ rồi………. nhặt lại làm gì cho xước nữa bàn tay.
23.
Chuyện tình cảm vô cùng rắc rối.
Đôi khi chúng ta là bạn.
Đôi khi chúng ta là một cặp đôi.
Và đôi khi chúng ta chẳng khác gì.. những người xa lạ.
24. Cảm ơn ai đó vì sự vô tâm hời hợt… để tôi biết rằng mình cần DỪNG LẠI ở đâu.
25. Đôi khi.. chỉ là khoảng trống của một người để lại. Mà cho dù.. có cả thế giới.. vẫn không thể lấp đầy..!!!!
26. Rất ít người…
…có thể cười 2 lần..
..cho cùng một câu chuyện cười.
Nhưng đa số mọi người….lại khóc rất nhiều lần..
..cho cùng một nỗi đau!
27. Tại sao những lúc giận nhau,
– Chúng ta cứ nghĩ đến hai chữ….. CHIA TAY…..
– Mà không hề nghĩ đến hai chữ….. VƯỢT QUA…..
Để rồi…….
– Chúng ta cứ vô tình làm đau nhau..
– Làm tổn thương nhau nhiều đến thế!….
28. Em cần:
Một chút thờ ơ để không còn quan tâm đến một người không đáng.
Một chút lạnh lùng để có thể ngẩng cao đầu mà bước qua anh.
Một chút tàn nhẫn để gạt bỏ đi quá khứ.
Một chút lạc quan để một lần nữa vững tin vào tình yêu.
Và……
Một chút mạnh mẽ để cho những giọt nước mắt không rơi.
Cuộc sống là vậy đó có buồn thì mới có vui, có giận hờn, chia tay thì mới có những phút giây hạnh phúc, sum vầy. Bạn đã tìm thấy những câu nói hay về tình yêu tan vỡ phù hợp với tâm trạng của bạn chưa? Hy vọng Status, những câu nói buồn về tình yêu tan vỡ đau khổ khi chia tay sẽ có thể chia sẻ với bạn một chút về những nỗi niềm, cho bạn cảm giác đồng cảm. Rồi mọi chuyện cũng sẽ tan đi, và hãy cho quá khứ ngủ yên trong trái tim để tìm kiếm và đón nhận cho mình một tình yêu mới nhé. Đừng quên ghé Vui5s.net ủng hộ chúng tôi mỗi ngày và khám phá nhiều điều hay các bạn nhé!!!
*Nguồn: Nhungloinoihay.net*

Vary: Accept-Encoding