phân biệt (*a)[10] và *a[10]
Phân biệt (*a)[10] và *a[10] trong C++
(*a)[10] tương đương với (*(a + 0))[10] tương đương với a[0][10]
*a[10] tương đương với *(a[10] + 0) và tương đương với a[10][0]
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 @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];
=> 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];
=> 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!
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.
A ha. Giờ mới để ý.
Vẫn thích it * hơn.