30/09/2018, 19:11

Có cách nào để không làm thay đổi giá trị của mảng khi truyền lên Hàm?

Chào các bạn,
giống như tiêu đề, mình thắc mắc không biết có cách nào làm được như vậy không(trong c/c++).??
Cảm ơn.

... viết 21:12 ngày 30/09/2018
// Example program
#include <iostream>
#include <string>

using namespace std;

void foo(const int* a)  {
    a[0] = 4; //Get an error, program prevent any command line which is modifying value in array.
}

int main()
{
    int a[] = { 1, 2, 3 };
    
    foo(a);
    
    cout << a[0] << endl;
}


Dùng cách này đảm bảo được việc nếu giá trị trong mảng bị thay đổi thì chắc chắn không phải do hàm foo gây ra.

hung222 viết 21:16 ngày 30/09/2018

#include <iostream>
#include <string>

using namespace std;

void foo(const int* a) {
a[0] = 4;
}

int main()
{
int a[] = { 1, 2, 3 };

foo(a);

cout &lt;&lt; a[0] &lt;&lt; endl;

}

Nó bị báo lỗi bạn à, chỗ a[0] = 4;

Vu Van Chung viết 21:18 ngày 30/09/2018

Bạn copy tham số đầu vào ra một mảng khác rồi xử lí trên mảng copy thôi!!

Gió viết 21:22 ngày 30/09/2018

Cách tốt nhất là bạn không thay đổi giá trị của phần tử trong hàm

... viết 21:18 ngày 30/09/2018

Nó báo lỗi vì mình đang cố thay đổi giá trị của mảng trong hàm.

P/s: Sao nhiều người không chịu đọc thông tin lỗi vậy nhỉ?

hung222 viết 21:17 ngày 30/09/2018

nhưng mà nếu mảng có quá nhiều phần tử thì copy lâu lắm bạn à. Mình muốn tìm hiểu xem có cách nào nhanh hơn copy không.

Pham Van Hai viết 21:16 ngày 30/09/2018

Câu trả lời đơn giản cho bạn là không có cách nào cả.
Trong C/C++ khi bạn truyền 1 mảng vào 1 hàm, thì tương đương với việc bạn truyền vào 1 con trỏ (trở tới địa chỉ đầu tiên của mảng) vào hàm -> khi giá trị của mảng được thay đổi trong hàm -> thoát khỏi hàm thì mảng cũng thay đổi theo.

minh tran viết 21:24 ngày 30/09/2018

Bạn không muốn thay đổi thì bắt buộc phải truyền vào const array thôi, còn muốn truyền vào thay đổi ở trong không thay đổi ở ngoài thì bắt buộc phải copy qua mảng khác.

viết 21:16 ngày 30/09/2018

cho cái code cụ thể khi nào cần làm vậy đi. Chỉ có 2 cách 1 là truyền const reference 2 là truyền bản copy. Truyền const ref thì ko chỉnh sửa được a[i] trong hàm f, chỉ đọc a[i] được thôi.

ko có cách nào mà bản truyền vào có thể bị chỉnh sửa trong khi bản chính ko thay đổi mà bản truyền vào ko phải là bản copy hết đó

Bài liên quan
0