30/09/2018, 17:11
`int (*a)[100]` khác với `int *a` và `int *a[100]` như thế nào?
Khi khai báo void Ham(int (*a)[100], int n, int m)
thì a
có ý nghĩa như thế nào?
-
int *a
vàint(*a)[100]
vàint *a[100]
khác nhau như thế nào? -
int (*a)[100]
để làm gì?
Bài liên quan
a là mảng 100 con trỏ.
int *a[100]
mới là mảng 100 con trỏ kiểu intChỗ này nó lằng nhằn một chỗ là có cái dấu
(*a)
, nên ta phải đọc làTool giúp mình dịch khai báo C
http://cdecl.org/
a xem lịch sử chỉnh sửa và thời gian chỉnh sửa cửa thớt đi ạ
Kakaka, hóa ra là vậy
Sorry @htwap nhé
hí, không có gì đâu ạ.
mà không hiểu sao lại dùng cái (*a)[100] này nhỉ? vì theo a nói thì *a trỏ đến 1 mảng 100 phần tử, thế để mình *a mà không cần [100] có được ko a?
Khác nhau về khái niệm
int (*a)[100]
là cho biếta
sẽ trỏ tới một mảng kiểuint
, mảng này có 100 phần tử kiểuint
.int *a
là để cho biếta
sẽ trỏ tới địa chỉint
, địa chỉ đó có thể là mảng.int *a[100]
là cho biếta
là mảng 100 phần tử, mỗi phần tử là một con trỏ kiểuint
.Khác nhau về kích thước giữa
int *a
vàint(*a)[100]
Khai báo
int (*a)[100]
là để khai báo rõ ràng rằnga
trỏ tới mảng kiểuint
với kích thước mỗi phần tử là400 bytes
bởi vì100 * 4 bytes = 400 bytes
. Choint
có kích thước4 bytes
.Khai báo
int *a
thì a có thể trỏ tới mảng kiểuint
với kích thước của mỗi phần tử là4 bytes
.Ví dụ
Kết quả
Tại sao
a100[1]
bằng 3 trong khipa100[1] = 2686748
, trông có vẻ là số rác. Đó là bởi vì địa chỉ màa100[1]
vàpa100[1]
trỏ đến là khác nhau.Ta thấy:
0028ff1c - 0028fd8c
= 4, đúng bằng kích thước của mộtint
0028ff1c - 0028fd8c
= 400, đúng bằng kích thước của100 int
Vậy có nghĩa theo anh Đạt khai báo:
int (*a)[100]; <=> int *a = new int[100]; phải không a.
Không phải @quanghuong1991 có thể in địa chỉ của hai khai báo này và địa chỉ sau khi tăng lên 1 để thấy có giống ví dụ của Đạt không.
Đạt không biết khai báo dùng
new
như thế nào để thể hiện được cái vụ thao tác+
lên con trỏ mà tăng 400 địa chỉ. Nên Đạt làm tạm một ví dụ khác sử dụng mộtstruct A100
có chứaint data[100]
Output
Ta chứng minh được là không phải
Còn về new một 100 phần tử kiểu int thì Đạt không biết phải new làm sao. Nên Đạt làm tạm cái
struct A100
.ví dụ này thiếu *a[100] với *a nữa a ơi…
Rất có thể. Anh không biết thuật ngữ này, tại lúc anh đi học anh chưa học tới phần này.
Ví dụ cho
*a
dễ mà. Ví dụ choint *a[100]
dở lắm. Anh thấy làm ví dụ chochar *bai_tho_con_coc[100]
hay hơn. Em thử nghiên cứuchar * s[100]
rồi làm ví dụ xem. Đấy cũng là một cách học. Tự đặt câu hỏi: "char *s
vàchar *s[100]
khác nhau như thế nào, khi nào dùng cái nào?"E thấy theo định nghĩa thì khai báo:
int *pa = new int[100];(1)
là khai báo mảng gồm 100 phần tử kiểu int, giống với bên trên anh nói với khai báo int (*pa)[100];(2)
Hay nó khác nhau ở chỗ (1) la pa trỏ đến đầu mảng. Còn (2) trỏ đến nguyên cả mảng. Như vậy theo (2) thì e thấy không đúng lắm.
Em đọc định nghĩa bị nhầm rồi.
new
không phải là “khai báo mảng”,new
là cấp phát vùng nhớ. Ở đây lệnhnew
chỉ cấp 400 bytes of RAM cho*pa
thôi. Không liên quan gì khai báo kiểu dữ liệu*pa
cả.Về bản chất,
*pa
vẫn chỉ làint *pa
,new
không làm thay đổi nó. Anh có thể tách ra làm hai dòng lệnh khác nhau.Trong khi đó ta thấy khai báo này
int (*pa)[100]
hoàn toàn khác với khai báoint *pa
. Đừng để ý tới vế sau dấu=
. Để ý phần khai báo biến.như vậy có phải
int (*pa)[100] chỉ là một con trỏ , và nó chỉ chứa địa chỉ của một mảng, mảng đó bắt buộc có 100 phần tử.
Vậy thì dùng cái này để làm gì ta. Dùng int *p vẫn linh động hơn nhiều .
ví dụ :
p thì có thể gán địa chỉ một biến int, một mảng một chiêu int bat kì só phần tử.
pa thì bi giới hạn rất nhiều
Đúng
Sai
int (*pa)[100]
là một con trỏ, nó trỏ tới một vùng nhớ có độ dài 100 phần tử kiểu int.int *p
là một con trỏ, trỏ tới một vùng nhớ có độ dài 1 phần tử kiểu intMảng, bản chất là một vùng nhớ liên tiếp. Ví dụ:
int mang[100]
là một vùng nhớ 400 bytes liên tiếp nhau. Nếu ta viếtint *p = mang
hoặcint *p = mang[0]
tức là ta trỏ p tới vùng nhớ có độ dài 1 phần tử kiểu int.Nếu ta viết
p[1]
hoặc(p+1)
, về bản chất ta trỏ tới phần tử kế tiếp củamang[0]
, phần tử này cũng là một vùng nhớ 4 bytes. Vùng nhớ này nằm trongint mang[100]
Nhưng nếu ta viết
int (*p)[100] = mang
hoặcint *p = mang[0]
tức là ta trỏ tới vùng nhớ có độ dài 100 phần tử kiểu int. Lúc nàyp
bao trùm toàn bộmang[100]
, tứcmang[1]
.Nếu ta viết
p[1]
hoặc(p+1
, về bản chất ta trỏ tới vùng nhớ cách xa vị trímang[0]
400 bytes và nằm ngoàiint mang[100]
.Xem lại ví dụ ở trên: `int (*a)[100]` khác với `int *a` và `int *a[100]` như thế nào?
Hai công cụ khác nhau, dùng cho hai mục đích khác nhau.
anh Đạt ơi em chưa hiểu int a[100]; thì là 1 con trỏ hằng chỉ vào 1 mảng ô nhớ phía sau mà mỗi phần tử trong a[100] cũng coi như là 1 con trỏ, cho em hỏi nó khác gì với int*a[100] ạ
Đây không phải là con trỏ hằng, khi nào có const mới gọi là hằng. Đây gọi là mảng. Chỉ có điều mảng không gán được sang địa chỉ khác, nên người ta mới nói à, mảng giống như con trỏ hằng. Nhưng nó không phải. Mảng về bản chất nó không phải là con trỏ. Mảng là một địa chỉ.
em thử cái này xem
Nhưng cái này thuộc về câu hỏi khác rồi.
thank a, em sẽ coi lại ^^
Anh xem e làm bảng này có đúng không ạ? e làm dựa vào những gì đọc được ở các bình luận trên
1.*pa
2.(*pa)[8]
3.*pa[8]
Cái 1 và 2 chính xác
cái 3 anh không hiểu lắm.
nghĩa là mảng con trỏ e viết tất cả các dấu * ở các phần tử ấy
pa[0] là con trỏ 1, vậy pa[0] + 5 ( cọng 1 số bất kì ) thì pa trỏ về đâu vậy anh?