30/09/2018, 16:38

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

Nguyễn Minh Dũng viết 18:47 ngày 30/09/2018

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

Minh Hoàng viết 18:49 ngày 30/09/2018

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

Tuấn Nguyễn viết 18:45 ngày 30/09/2018

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 )

Bài liên quan
0