01/10/2018, 13:48

Vì sao C không thể thực phép gán 2 mảng

Vì sao C không thể thực phép gán 2 mảng và tại sao C lại làm như vậy?

Theo em hiểu thì, trong C khi thực hiện phép gán thì vế trái sẽ là một biến và về phải là một giá trị, mà tên mảng thì lại là hằng con trỏ, nhưng tại sao C lạ làm như vậy trong khi các ngôn ngữ khác như Pascal thì lại gán được và một số ngôn ngữ nữa. Em cám ơn ạ

Dark.Hades viết 16:01 ngày 01/10/2018

Code đi bạn.

Giải thích dài thì paste luôn code mọi người sẽ giúp bạn

C dùng để viết lên những ngôn ngữ khác, không có gì mà ngôn ngữ con làm được mà nó không làm được cả

Nobita viết 16:00 ngày 01/10/2018

trong quá trình tìm hiểu em thắc mắc thôi, chứ không có bài tập nào cả, em vừa edit lại câu hỏi cho chuẩn rồi anh ạ.

Dark.Hades viết 15:52 ngày 01/10/2018

Thì mình cũng đang thắc mắc câu hỏi của bạn, phép gán mảng của bạn là như thế nào?

*grab popcorn* viết 16:00 ngày 01/10/2018

Ngắn gọn là ý bạn dó thế này:

Đáng lẽ là cái này phải hợp lý:

int a[] = {1, 2, 3};
int b[] = {3, 4, 5};
a = b;

nhưng tại sao lại không được?

Nobita viết 16:02 ngày 01/10/2018

Vâng a, theo như ý anh @grab đó anh.

Nobita viết 16:01 ngày 01/10/2018

Về tại sao thì theo như em giải thích có đúng không vậy anh? còn vể vấn đề ý nghĩa của việc này để giải thích tại sao C lại làm như vậy thì em không biết?

Dark.Hades viết 15:55 ngày 01/10/2018

Theo mình biết thì mảng cố định nó là con trỏ, vậy nên việc gán con trỏ này vào con trỏ kia là bất hợp lí.

*grab popcorn* viết 15:52 ngày 01/10/2018

Một lý do mình từng đọc ở đâu đó là: C không quan tâm tới chiều dài của mảng. Nên việc gián giá trị 2 mảng như vậy C không xử lý được và dễ bị khai thác lỗi ~> không cho xài. :v

Nãy giờ tìm lại mà không thấy nên chỉ nhớ vậy, mà chắc nghe thấy cũng hợp lý xD

EDIT: Ấy, mình ko chắc mà, còn lì do thật chắc chỉ có bác Ken Thompson với bác Dennis Ritchie biết xD

Nobita viết 15:56 ngày 01/10/2018

Em cám ơn anh và anh Dark.Hades

Nguyễn Phạm Anh Quân viết 15:55 ngày 01/10/2018

Để giải thích việc này, phải hiểu tại sao lại có pointer type trong khi các ngôn ngữ bậc cao hơn hầu như ko có!
Pointer là biến chỉ lưu địa chỉ, có giá tri bằng 4 bytes đối với OS 32bit và 8 bytes đối với OS 64bit! Pointer ra đời giúp ích rất nhiều cho việc duyệt mảng vì nó rất nhanh, và nó cũng giúp C/C++ gần với ngôn ngữ máy hơn!
Tên của array là địa chỉ đầu tiên của biến đầu tiên trong mảng, vd:
int arr[5] = {1, 2, 3, 4, 5}; //arr == &arr[0] == 1
C/C++ chia ra lvalue & rvalue! lvalue nói đơn giản là biến chỉ chứa địa chỉ, nên ta phải gán giá trị trực tiếp cho nó! Trong trường hợp gán mảng, vd arr[0] = 5 thì gán giá trị của biến đầu tiên là 5! Tương tự nếu em gán arr1 = arr2 thì nó chỉ gán địa chỉ đầu tiên thôi, nó ko thể hiểu tiếp theo con trỏ mảng sẽ đi đâu (cái này gọi là shallow copy), nên cách làm này nên tránh!
Còn các ngôn ngữ bậc cao hơn thì nó luôn qui về 1 Object, tức là có mọi hàm cần thiết để em duyệt các giá trị chứa trong object đó, nên em ko cần quan tâm tới địa chỉ của Object đó làm gì, nên có thể dễ dàng gán 2 mảng (vd vậy)!

Nobita viết 15:57 ngày 01/10/2018

//arr == &arr[0] == 1

//arr == &arr[0] == 1 => chỗ này chắc anh nhầm ạ.
còn cài đoạn “Tương tự nếu em gán arr1 = arr2 thì nó chỉ gán địa chỉ đầu tiên thôi” em chưa rõ lắm ạ, em cám ơn anh

Nguyễn Phạm Anh Quân viết 15:48 ngày 01/10/2018

Thì arr1 <=> &arr[0] tức là lvalue, địa chỉ của biến đầu tiên, phải gán giá trị cho nó
arr2 <=> &arr2[0], cũng là địa chỉ đầu tiên, rồi các địa chỉ tiếp theo nó phải gán ra sao? Phép gán arr1 = arr2 ko giải quyết được!

Anh ko nhầm mà chỉ viết sai ký hiệu:
arr <=> &arr[0], có giá trị bằng 1

Nobita viết 15:56 ngày 01/10/2018

vâng ạ, tại em hiểu nhầm, em cám ơn anh.

Nguyễn Phạm Anh Quân viết 15:57 ngày 01/10/2018

Em đọc thêm bài này về lvalue và rvalue nhé! https://eli.thegreenplace.net/2011/12/15/understanding-lvalues-and-rvalues-in-c-and-c

Bài liên quan
0