01/10/2018, 10:25

Phân biệt (*a)[10] và *a[10] trong C++

phân biệt (*a)[10] và *a[10]

Henry viết 12:33 ngày 01/10/2018
(*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]
Tao Không Ngu. viết 12:35 ngày 01/10/2018

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.

Konosuke viết 12:36 ngày 01/10/2018

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.

Trần Hoàn viết 12:25 ngày 01/10/2018

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].

Khoa NTA viết 12:29 ngày 01/10/2018

@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')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?

Trần Hoàn viết 12:25 ngày 01/10/2018

Ừ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.

Tao Không Ngu. viết 12:36 ngày 01/10/2018

A ha. Giờ mới để ý.
Vẫn thích it * hơn.

Bài liên quan
0