30/09/2018, 19:05

Cho mình hỏi về kiểu con trỏ

Mình có khai báo 1 biến con trỏ int *a=new int[3];
Rồi for(int i=0;i<10;i++){
a[i]=i;
}
thì chương trình không có lỗi gì và khi mình xuất ra cũng không có lỗi có phải con trỏ không liên quan đến kích thước lúc đầu khai báo không ai biết giải thích cho mình với

明玉 viết 21:11 ngày 30/09/2018

Bạn cứ cho 10 thành 9999999 đi là hiểu, chạy debug thì tràn mảng 1 tí sẽ không báo lỗi.

Nguyễn Văn Tuấn viết 21:18 ngày 30/09/2018

Tức là làm vậy là không đúng phải không bạn

Nguyễn Việt Nhật viết 21:08 ngày 30/09/2018

Chào bạn.

Vùng nhớ khi khai báo động nằm trong bộ nhớ heap.
Khi khai báo *a=new int[3]; thì trình biên dịch tìm trong heap memory 3 * sizeof(int) bytes chưa sử dụng để cấp phát cho mảng a, khi đó a mang giá trị địa chỉ cấp 1. Như vậy a[10] nó vẫn có thể hợp lệ, đó là ô nhớ thứ 11 đếm qua phải từ ô nhớ a trỏ đến. Nhưng có thể nó chưa được sử dụng, cũng có thể nó đang được quản lý bởi con trỏ khác chẳng hạn.

Nguyễn Văn Tuấn viết 21:21 ngày 30/09/2018

Thank nhé tiện cho mình hỏi luôn mình muốn Malloc con trỏ ở bên hàm khác ví dụ
void LinhTinh(int *&a) thì tại sao lại phải có & ạ mà các phép toán bình thường thì không cần & cũng được

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

Thử lấy cái hình này và đoạn code bên dưới cho dễ hiểu.

Ideone.com

Ideone.com

Ideone is something more than a pastebin; it's an online compiler and debugging tool which allows to compile and run code online in more than 40 programming languages.

#include <iostream>
using namespace std;

int main() {
    // your code goes here
    
    int value = 5;
    
    int *a = &value;
    
    cout << &value << endl;
    
    cout << &a << endl;
    cout << a << endl;
    cout << *&a << endl;
    
    return 0;
}

Như kết quả thì khi in ra a, *&a có giá trị giống &value.
Thế nên về mặt cơ bản, cả 3 cái trên đều tham chiếu đến địa chỉ của biến value.
Nhưng khi truyền vào hàm theo kiểu *&a, thì thực chất là thay đổi giá trị value bằng cách thay đổi giá trị mà con trỏ a đang tham chiếu tới.

Nguyễn Văn Tuấn viết 21:16 ngày 30/09/2018

Thank b nhưng mình vẫn chưa hiểu lắm vì nếu 1 hàm bình thường muốn thay đổi giá trị thì chỉ cần truyền kiểu * như void ThayDoi(int *a,int n) rồi for(int i=0;i<n;i++) a[i]+=1 thì giá trị nó vẫn thay đổi nhưng nếu dùng malloc thì lại phải thêm *&a

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

vì khi malloc thì giá trị của con trỏ truyền vào có thay đổi, còn các hàm bình thường thì giá trị trong mảng / phần tử mà con trỏ trỏ tới bị thay đổi.

void ThayDoi(int *a,int n): chỉ thay đổi được *a, ko thay đổi được a. Khi gọi ThayDoi(p, n) thì ko phải con trỏ p được truyền vào hàm ThayDoi, mà 1 bản copy của p được truyền vào.

LinhTinh(int *&a): thay đổi được *a và cả a. Khi gọi LinhTinh(p) thì chính p được truyền vào LinhTinh. Khi viết a = (int*) malloc(...) thì giá trị của a bị thay đổi. Nếu ko truyền bản chính mà truyền bản copy thì giá trị của p (hay địa chỉ mà p trỏ tới) ko bị thay đổi, vì chỉ có giá trị bản copy bị thay đổi.

trong C/C++ các tham số luôn được truyền vào bản copy. Muốn truyền bản chính (tham chiếu) thì phải viết dấu &.

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

http://diendan.congdongcviet.com/threads/t42977::tim-hieu-ban-chat-cua-con-tro-tu-co-ban-den-nang-cao.cpp

Bài liên quan
0