Với *a[10] bạn tạo ra một mảng có 10 pointer
Với (*a)[10] bạn tạo chỉ tạo ra một pointer trỏ đến 1 mảng có 10 phần tử. Nó cũng tương tự việc bạn khai báo *a và cấp phát cho nó 10 phần tử vậy.
Nếu như a là một con trỏ cấp 2 (int**, int*[], int[]*, int[][]) đã được khai báo và khởi tạo trước đó thì giải thích như bạn @graktung
Còn nếu như đó là dòng khai báo:
Khi khai báo, bạn nên viết int* n; thay vì int *n; bởi vì int* là một kiểu dữ liệu. n là một biến có kiểu dữ liệu là int*
riêng với trường hợp của bạn ta sẽ xem xét:
int *a[10];
viết lại:
int* a[10];
image.png1366x768 46.9 KB
=> a là một mảng có 10 phần tử, mỗi phần tử có kiểu dữ liệu là int* => Mảng con trỏ
int (*a)[10];
image.png1366x768 47.8 KB
=> a là một con trỏ, trỏ đến vùng nhớ kiểu int[10].
@noz1995 nói rồi , nhưng mình muốn lưu ý một chút!
Khi khai báo, bạn nên viết int* n; thay vì int *n; bởi vì int* là một kiểu dữ liệu. n là một biến có kiểu dữ liệu là int*
Mình dùng trình biên dịch C của GNU và nó phải là int * chứ không phải int* nếu không muốn nhầm lẫn: int* a, b; không giống như int *a, *b; (còn của M$ như thế nào thì mình không biết, mình không xài Visual Studio ). Test với code như sau (http://cpp.sh/5efhl):
#include <stdio.h>
#include <string.h>
int main()
{
int* a, b;
*b;
return 0;
}
Compile lỗi error: invalid type argument of unary '*' (have 'int') vì b không phải con trỏ :v
P/s: đừng giận vì mình sửa lưng nha có gì thì sửa cho nhau mà, đúng hong?
Ừa, bạn sửa thế đúng hơn. Ngay cả trong screenshot của mình nó cũng ghi kiểu dữ liệu là int *
Mà, đó cũng là 1 trong những lý do khiến cho mình quyết tâm không học C++ đến nơi đến chốn . Mình chủ yếu học C#, không có cách khai báo nào lủng củng như vậy.
Hi Hưng Nguyễn.
Không nhầm thì cái này có người hỏi rồi bạn tìm lại để có giải thích rõ hơn.
Với *a[10] bạn tạo ra một mảng có 10 pointer
Với (*a)[10] bạn tạo chỉ tạo ra một pointer trỏ đến 1 mảng có 10 phần tử. Nó cũng tương tự việc bạn khai báo *a và cấp phát cho nó 10 phần tử vậy.
Nếu như a là một con trỏ cấp 2 (
int**
,int*[]
,int[]*
,int[][]
) đã được khai báo và khởi tạo trước đó thì giải thích như bạn @graktungCòn nếu như đó là dòng khai báo:
Khi khai báo, bạn nên viết
int* n;
thay vìint *n;
bởi vìint*
là một kiểu dữ liệu.n
là một biến có kiểu dữ liệu làint*
riêng với trường hợp của bạn ta sẽ xem xét:
=>
a
là một mảng có 10 phần tử, mỗi phần tử có kiểu dữ liệu làint*
=> Mảng con trỏ=>
a
là một con trỏ, trỏ đến vùng nhớ kiểuint[10]
.@noz1995 nói rồi , nhưng mình muốn lưu ý một chút!
Mình dùng trình biên dịch C của GNU và nó phải là
int *
chứ không phảiint*
nếu không muốn nhầm lẫn:int* a, b;
không giống nhưint *a, *b;
(còn của M$ như thế nào thì mình không biết, mình không xài Visual Studio ). Test với code như sau (http://cpp.sh/5efhl):Compile lỗi
error: invalid type argument of unary '*' (have 'int')
vìb
không phải con trỏ :vP/s: đừng giận vì mình sửa lưng nha có gì thì sửa cho nhau mà, đúng hong?
Ừa, bạn sửa thế đúng hơn. Ngay cả trong screenshot của mình nó cũng ghi kiểu dữ liệu là
int *
Mà, đó cũng là 1 trong những lý do khiến cho mình quyết tâm không học C++ đến nơi đến chốn . Mình chủ yếu học C#, không có cách khai báo nào lủng củng như vậy.
A ha. Giờ mới để ý.
Vẫn thích it * hơn.