Giải đố về con trỏ nâng cao

Các bạn nhập môn ai giải thích được 2 cách khai báo sau
1/

double (*elephant)[20];

2/

double* (*elephant)[3];

cộng với viết 1 đoạn code nhập ,xuất mảng 2 chiều 3 dòng , 3 cột (hoặc mảng răng ) dùng cách khai báo thứ 2 thì anh sẽ share cho các bạn 1 kho đồ sồ tài liệu về lập trình :smile:

2 Likes

1 - là con trỏ đến mảng 20 double, ví dụ cách sử dụng

#include <stdio.h>

int main()
{
    double (*elephant)[5]; // pointer to array of 5 double
    double darry[5] = { 1.1, 2.2, 3.3, 4.4, 5.5 }; // array of 5 double
    elephant = &darry; // assign elepant to &darry

    int i;
    for (i = 0; i < 5; ++i)
        printf("%f\n", *(*elephant+i));

    return 0;
}

2 - là con trỏ đến mảng 3 con trỏ double, ví dụ cách sử dụng

#include <stdio.h>

int main()
{
    double* (*elephant)[3]; // pointer to array of 3 pointers to double
    double *pdarry[3]; // array of 3 pointers do double
    double darry[3] = { 1.1, 2.2, 3.3 }; // array of 3 double

    int i;

    elephant = &pdarry; // assign elephant to &pdarry

    for (i = 0; i < 3; ++i)
        pdarry[i] = &darry[i];
    
    for (i = 0; i < 3; ++i)
        printf("%f\n", *(*(*elephant)+i));

    return 0;
}

Biết cái này thì cũng hay, nhưng thực tế rất ít trường hợp sử dụng. Nhưng biết mấy cái này đi hù interviewer có vẻ khá ổn :smiley:

5 Likes

cái này gọi là con trỏ đa cấp này :smile: vẫn hay dùng để cấp phát động

1 Like

Chuẩn rồi anh Đạt

*(*((*elephant)+i)) <=> *(pdarray[i]);

Vì elephant nó đang trỏ đến 1 mảng gồm 3 phần tử kiểu double*.
Cái đoạn này anh gán vậy tức cho lần lượt 3 con trỏ double* của mảng pdarry trỏ đến lần lượt 3 biến trong mảng darry.

for (i = 0; i < 3; ++i)
        pdarry[i] = &darry[i];

Còn để cho 3 phần tử của pdarry trỏ đến 3 mảng 1 chiều là thế này

 double* p[3];
   p[0] = new double[3];
   p[0][0] = 1;
   p[0][1] = 2;
   p[0][2] = 3;
   p[1] = new double[3];
   p[1][0] = 4;
   p[1][1] = 5;
   p[1][2] = 6;
   p[2] = new double[3];
   p[2][0] = 7;
   p[2][1] = 8;
   p[2][2] = 9;
   for(int i = 0; i < 3; i++)
   {
	   pdarry[i] = p[i];
   }

Nói tóm lại 2 cách trên ko phải là khai báo con trỏ đa cấp mà là khai báo con trỏ trỏ tới mảng .
Câu 2 là khai báo con trỏ để quản lý 3 con trỏ cấp 1 double* .Nó gần như là khai báo hẵn con trỏ cấp 2
nhưng đây là khai báo mảng tỉnh các con trỏ cấp 1 !
=> Nó có mối liên hệ mật thiết với mảng 2 chiều ( mảng của các mảng 1 chiều ) :smile:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?