Chủ đề: Mọi người giúp e với!
-
13-03-2014, 04:59 PM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Mọi người giúp e với!
E đang học phần con trỏ trong C++,e chưa rõ về phần này lắm.Mọi người cho em hỏi
#include<stdio.h>
#include<conio.h>
int main(){
int **a=NULL;
printf("Nhap n = ");scanf("%d",&n);
if(!capphat(a,n)){
printf("khong du bo nho");
return 1;
}
int capphat(int **a,int n){
a=new int*[n]; //cho e hỏi luôn câu lệnh này khác gì với câu lệnh *a=new int[n]?
if (a==NULL) return 0;
for(int i=0;i<n;i++)
{*(a+i)=new int[n];
if(*(a+i)==NULL) return 0;
return 1;
}
}
}
1. E muốn cấp phát cho mảng 2 chiều,nhưng sao chuơng trình nó báo lỗi ạ,e đọc thấy bảo phải truyền vào tham chiếu thế nên phải thay thành capphat(int **&a,int n),nhưng e vẫn chưa hiểu rõ lắm ạ,mọi người chỉ e kĩ với.
2. Tiếp theo e muốn hỏi khi nào thì chúng ta dùng con trỏ cấp 2,cấp 3? và e khai báo int **a thì e muốn hỏi a là gì? *a là gì? **a là gì? và e khai báo như thế thì a = &a đúng không ạ (cùng là địa chỉ của mảng a).
3. Giả sử e khai báo 1 biến ở đầu chuơng trình,đến khi viết 1 hàm e cần dùng biến đấy,e muốn ko cần khai báo vào trong hàm thì có được ko ạ ? Ví dụ như capphat(a,n,m,...) mà n với m e dùng làm biến chính rồi thì có cách nào chỉ cần gọi capphat(a) mà trong thân hàm vẫn dùng được n,m không ạ? (Vì e thấy mỗi lần khai báo như thế thì hàm sẽ rất dài [IMG]images/smilies/biggrin.png[/IMG] ).
Các pro giúp e với nhá,e mới học,viết theo ý hiểu của e, mọi người đừng gạch đá e nhá [IMG]images/smilies/biggrin.png[/IMG]View more random threads:
- TC++ dùng using namespace std không được???
- Làm Sao để Viết chương trình nhập vào 4 số, sắp xếp lại theo thứ tự tăng dần.
- Chương trình quản lý môn học, lỗi ở đâu??
- chưa hiểu cau hỏi nên hỏi
- Thay đổi giá trị sau mỗi lần chạy
- Bài tập mảng 2 chiều
- nhập mảng và in ra số lớn nhất trong dãy
- bài tập C mảng 2 chiều!
- Trị tuyệt đối số thực
- bảng mã ASCII
-
13-03-2014, 05:01 PM #2Silver member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Đây ko phải là C !!! (vì có toán tử new trong đó)
2. Con trỏ cấp 3 thì có ai dùng đâu.
Con trỏ cấp 2 để xây dựng ma trận.
3. Lúc đó n, m ở đâu ra mà dùng?
p/s: toán tử new khi hết mem sẽ văng exception chứ ko trả về NULL.
-
13-03-2014, 05:10 PM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Ah e nhầm C++,a ơi cho em hỏi,khai báo int **a,vậy a với &a là như nhau phải không a?
Vơi lại câu số 3 : E muốn thu gọn hàm như pascal ấy,mỗi lần muốn dùng là lại phải khai báo tùm lum ra,không có cách khai báo cho biến đấy chạy toàn bộ chương trình ah a?
-
13-03-2014, 05:21 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi chumanhquang
3. Việc này không khuyến khích, vì đây là một thói quen không tốt.
-
13-03-2014, 05:30 PM #5Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi prog10
-
14-03-2014, 08:05 AM #6Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
int** a là con trỏ trỏ tới 1 con trỏ khác.
giá trị của a là địa chỉ con trỏ mà nó đang trỏ tới.
khi cấp phát động thì giá trị của a thay đổi, tức là hàm cấp phát động phải truyền a theo tham chiếu &a.
khi giải phóng a thì giá trị của a không nhất thiết phải thay đổi, nên ko cần truyền tham chiếu. (Nhưng nếu cẩn thận thì sau khi giải phóng cần đổi giá trị của a thành NULL, tức là cần thay đổi giá trị của a, tức là cần truyền a theo tham chiếu &a)
Vd mảng int 3x4 được cấp phát động:
a = new int*[3];
Mã:( 0) [2024] → (2024)(2032)(2040) [ ? ][ ? ][ ? ]
size của 1 con trỏ là 8 bytes, là size của size_t
size của 1 int là 4 bytes
a là biến có địa chỉ 0, được cấp phát động = int*[3] sẽ trỏ tới địa chỉ 2024. Địa chỉ từ 2024..2047 chứa giá trị của 3 con trỏ a[0], a[1], a[2], chưa biết.
for (int i = 0; i < 3; ++i) a[i] = new int[4];
Mã:( 0) [2024] → (2024) (2032) (2040) [3000] [3016] [3032] ↓ ↓ ↓ (3000..3015)(3016..3031)(3032..3048) [? ? ? ?][? ? ? ?][? ? ? ?]
nếu a được truyền theo tham trị, tức là a bị copy thành con trỏ khác và con trỏ khác này được truyền vào hàm cấp phát, nên dù mảng (2024..2040) và (3000..3048) đã có trên heap nhưng a vẫn ko trỏ tới 2024.
thấy rối rắm vụ truyền con trỏ vào tham chiếu hay tham trị thì có thể viết hàm cấp phát như sau:
Mã:int** array2d(size_t row, size_t col){ int** grid = new int*[row]; for (size_t i = 0; i < row; ++i) grid[i] = new int[col]; return grid;}
Mã:void alloc2d(int**& a, size_t row, size_t col){ a = new int*[row]; for (size_t i = 0; i < row; ++i) a[i] = new int[col];}
Mã:void free2d(int** a, size_t row){ for (size_t i = 0; i < row; ++i) delete [] a[i]; delete [] a;}
Mã:void free2d_safe(int**& a, size_t row){ for (size_t i = 0; i < row; ++i) delete [] a[i]; delete [] a; a = NULL;}
Mã:int** a = array2d(m, n);//...free2d(a, m); int** b = NULL;alloc2d(b, n, m);//...free2d(b, n);
để ý ở dòng thứ 3 của alloc2d, a = ..., tức là giá trị của a thay đổi, tức là a phải truyền theo tham chiếu. Tương tự trong hàm free2d_safe ở dòng thứ 5, a = NULL.
-
14-03-2014, 09:25 AM #7Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi chumanhquang
- Tham trị có đặc điểm là truyền 1 bản copy của tham số hình thức vào hàm để sử dụng, mọi thao tác trên tham số hình thức trong hàm tức là thao tác với bản copy.
- Tham chiếu là truyền trực tiếp (địa chỉ của) tham số hình thức vào hàm, mọi thao tác trên tham số hình thức trong hàm tức là thao tác với bản gốc.
Tham trị sẽ tốn thời gian cho việc copy, nên với các object thì dùng tham chiếu.
Nhưng nếu dùng tham chiếu thì lại nảy sinh vấn đề: với tham chiếu thì hàm toàn quyền đọc ghi lên bản gốc, nên sinh thêm từ khóa const để khóa quyền ghi qua tham số hình thức.
-
14-03-2014, 07:29 PM #8Silver member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi prog10
Còn tham chiếu theo mình biết đó là tạo một Biến tham chiếu (Reference variable) và cho nó tham chiếu đến đối số.
trong sách của GS Phạm Văn Ất có viết:
+ Biến tham chiếu không được cấp phát bộ nhớ, không có địa chỉ riêng.
+ Nó dùng làm bí danh (alias) cho một biến (kiểu giá trị) nào đó và nó sử dụng vùng nhớ của biến này
-
16-03-2014, 08:02 AM #9Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Ặc ặc,có cả tham trỏ nữa ah?
- - - Nội dung đã được cập nhật ngày 16-03-2014 lúc 01:02 AM - - -
Gửi bởi INTP
Bất chấp những lầm tưởng phổ quát, hồ hết những người có âm đạo đều khó lên đỉnh khi bị kích thích âm đạo. Tuy nhiên, điều đó không có tức thị nó không thể vui được! Việc xâm nhập vào âm đạo bằng...
Quý bà giải tỏa bằng việc kích...