Truy xuất các phần tử mảng qua con trỏ
Giả sử A là mảng một chiều như trên chúng ta có:
- A là con trỏ trỏ tới A[0] hay A tương đương với &A[0]
- (A +1) là con trỏ trỏ tới phần tử kiểu T kế tiếp sau A[0] tức là A+1 trỏ tới A[1]
hay (A+1)
⇔ &A[1]
- Tổng quát (A+i)
⇔ &A[i]
Như chúng ta biết từ trước là nếu p là con trỏ lưu địa chỉ của biến x thì * p là giá trị
của x.
Như vậy *A chính là giá trị của A[0], *(A+1) là A[1],...
tổng quát chúng ta có *(A+i)
⇔A[i]
Gi¸o tr×nh tin häc c¬ së II - N
gôn ngữ
C
86
Ví dụ chúng ta có thể minh họa bằng đoạn lệnh nhập và in các phần tử mảng A như
sau:
int A[10];
int i;
....
// nhập mảng A có 10 phần tử
for(i = 0; i<10; i++)
{ printf(“A[%d] = “, i);
scanf(“%d”, A+i);
}
// in mảng A có 10 phần tử,
for(i = 0; i<10; i++)
{ printf(“A[%d] = “, i);
scanf(“%d”, *(A+i));
}
Với mảng 2 chiều D[n][m] cũng tương tự như trên ta có:
• D là con trỏ trỏ tới hàng dầu tiên trong mảng tức là: D ⇔ &D[0]
- D[0] là con trỏ trỏ tới phần tử đầu tiên là D[0][0] hay D[0]
⇔ &D[0][0]
nên *D[0]
⇔ D[0][0];
hay ** D
⇔ D[0][0]
- (D[0]+j ) con trỏ tới phần tử D[0][j], hay (D[0]+j)
⇔ &D[0][j]
nên ta có *(D[0]+j)
⇔ D[0][j]
hay *(*D+j)
⇔ D[0][j]
• Tương tự tổng quát ta có (D+i) ⇔ &D[i].
- D[i] là con trỏ trỏ tới phần tử đầu tiên là D[i][0] hay D[i]
⇔ &D[i][0]
nên *D[i]
⇔ D[i][0];
hay *(*D+i)
⇔ D[i][0]
- (D[i]+j ) con trỏ tới phần tử D[i][j], hay (D[i]+j)
⇔ &D[i][j]
nên ta có *(D[i]+j)
⇔ D[i][j]
hay tổng quát ta có *(*(D+i)+j)
⇔ D[i][j]
Gi¸o tr×nh tin häc c¬ së II - N
gôn ngữ
C
87
Chia sẻ với bạn bè của bạn: |