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 ạ
Bài liên quan
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ả
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 ạ.
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?
Ngắn gọn là ý bạn dó thế này:
Đáng lẽ là cái này phải hợp lý:
nhưng tại sao lại không được?
Vâng a, theo như ý anh @grab đó anh.
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?
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í.
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
Em cám ơn anh và anh Dark.Hades
Để 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)!
//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
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
vâng ạ, tại em hiểu nhầm, em cám ơn anh.
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