You are on page 1of 17

om

.c
ng
Nhập môn Lập trình – IT001

co
an
th
ng
Con trỏ và Mảng
o
du
u
cu

2015 1
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nội dung

om
• Sự tƣơng quan mảng 1 chiều và con trỏ

.c
• Sử dụng tham số mảng 1 chiều trong hàm

ng
co
• Sự tƣơng quan mảng 2 chiều và con trỏ

an
• Sử dụng tham số mảng 2 chiều trong hàm
th
o ng
du
u
cu

2015 2
CuuDuongThanCong.com https://fb.com/tailieudientucntt
SỰ TƢƠNG QUAN MẢNG 1 CHIỀU VÀ CON
TRỎ

om
• Tên của mảng là một hằng địa chỉ, chứa địa chỉ của phần tử

.c
đầu tiên.

ng
co
• Với khai báo: int a[10] thì:
a tương đương với &a[0]

an
th
a+i tương đương với &a[i] ng
*(a+i) tương đương với a[i]
o
du

• Xét khai báo : int a[5], *pa=a; khi đó con trỏ pa giữ địa chỉ
u

của phần tử đầu tiên của mảng a. Lúc này:


cu

pa+i tương đương với &a[i].


*(pa+i) tương đương với a[i].
www.uit.edu.vn
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nhắc lại: Nhập xuất mảng 1 chiều

#include <stdio.h> for(i=0;i<n;i++)

om
#include <conio.h> {

.c
#define MAX 100 printf("Nhap phan tu a[%d]: ",i);

ng
void main() scanf("%d", &a[i]);

co
}
{

an
for(i=0;i<n;i++)

th
int a[MAX], n, i;
printf("%4d", a[i]);
ng
printf(“So phan tu cua
o
mang:"); }
du

scanf("%d",&n);
u
cu

www.uit.edu.vn
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ví dụ: Nhập xuất mảng 1 chiều bằng con trỏ

#include <stdio.h> for(i=0;i<n;i++)

om
#include <conio.h> {

.c
#define MAX 100 printf("Nhap phan tu a[%d]: ",i);

ng
void main() scanf("%d", a+i);

co
}
{

an
for(i=0;i<n;i++)

th
int a[MAX],n,i;
printf("%4d", *(a+i));
ng
printf(“So phan tu cua
o
mang:"); }
du

scanf("%d",&n);
u
cu

www.uit.edu.vn
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ví dụ: Nhập xuất mảng 1 chiều bằng con trỏ

#include <stdio.h> for(i=0;i<n;i++)

om
#include <conio.h> {

.c
#define MAX 100 printf("Nhap phan tu a[%d]: ",i);

ng
void main() scanf("%d", pa+i);

co
}
{

an
for(i=0;i<n;i++)

th
int a[MAX],n,i,*pa;
printf("%4d", *(pa+i));
ng
pa=a;
o
}
du

printf(“So phan tu cua


mang:");
u
cu

scanf("%d",&n);

www.uit.edu.vn
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nhắc lại: truyền tham số là mảng cho hàm
Ví dụ:

om
int TinhTong( int pa[], int n);
void main()

.c
{

ng
int a[10], n;

co
TinhTong(a, n);

an
th
} ng
int TinhTong( int pa[], int n)
o
{
du

….
u
cu

}
Ở ví dụ trên, tham số hình thức của mảng a trong
hàm TinhTong khai báo dùng mảng hình thức: int
pa[] www.uit.edu.vn
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tham số hình thức cho hàm là con trỏ
Ví dụ:

om
int TinhTong( int *pa, int n);
void main()

.c
{

ng
int a[10], n;

co
TinhTong(a, n);

an
th
} ng
int TinhTong( int *pa, int n)
o
{
du

….
u
cu

}
Ở ví dụ trên, tham số hình thức của mảng a trong
hàm TinhTong có thể khai báo dùng con trỏ: int *pa
www.uit.edu.vn
CuuDuongThanCong.com https://fb.com/tailieudientucntt
SỰ TƢƠNG QUAN MẢNG 2 CHIỀU VÀ CON
TRỎ

om
• Mảng 2 chiều là mảng (1 chiều) của mảng.

.c
• Khi khai báo: int a[2][3] thì trong bộ nhớ tạo ra:

ng
Phần tử a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]

co
Địa chỉ 1 2 3 4 5 6

an
th
Tức mảng a có 2 phần tử, mỗi phần tử là 1 mảng chứa 3 số nguyên.
ng
• Tên mảng a chứa địa chỉ của phần tử đầu tiên.
o

• Địa chỉ phần tử đầu tiên có kiểu int[3]


du

• Với khai báo: int a[2][3] thì:


u
cu

a tương đương với &a[0][0]


a+1 tương đương với &a[1][0]
…..
www.uit.edu.vn
CuuDuongThanCong.com https://fb.com/tailieudientucntt
SỰ TƢƠNG QUAN MẢNG 2 CHIỀU VÀ CON
TRỎ

om
• Xét khai báo : int a[2][3], *pa;

.c
pa = (int*)a;

ng
Khi đó:

co
pa tương đương với &a[0][0].

an
pa+1 tương đương với &a[0][1].
pa+2 tương đương với &a[0][2].
th
ng
pa+3 tương đương với &a[1][0].
o
du

pa+4 tương đương với &a[1][1].


u

pa+5 tương đương với &a[1][2].


cu

Chú ý: vì a là địa chỉ kiểu int[3], pa là con trỏ kiểu int.


Nên phải ép kiểu như sau: pa = (int*)a
www.uit.edu.vn
CuuDuongThanCong.com https://fb.com/tailieudientucntt
SỰ TƢƠNG QUAN MẢNG 2 CHIỀU VÀ CON
TRỎ

om
• Xét khai báo : int a[2][3], *pa;

.c
pa = (int*)a;

ng
Khi đó:

co
*pa tương đương với a[0][0].

an
th
*(pa+1) tương đương với a[0][1].
ng
*(pa+2) tương đương với a[0][2].
o
du

*(pa+3) tương đương với a[1][0].


u
cu

*(pa+4) tương đương với a[1][1].


*(pa+5) tương đương với a[1][2].
www.uit.edu.vn
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nhắc lại: Nhập xuất mảng 2 chiều

#include <stdio.h> for(i=0;i<n;i++)

om
#include <conio.h> for (j=0;j<m;j++)

.c
{
#define RMax 100

ng
printf("Nhap phan tu a[%d][%d]:
#define CMax 100

co
",i,j);
void main() scanf("%d", &a[i][j]);

an
}

th
{ ng for(i=0;i<n;i++)
int a[RMax][CMax], n, m, i, j; {
o
for (j=0;j<m;j++)
du

printf(“So dong va cot:");


scanf("%d%d",&n,&m); {
u
cu

printf(“%d ", a[i][j]);


}
printf(“\n");
}
}
www.uit.edu.vn
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ví dụ: Nhập xuất mảng 2 chiều bằng con trỏ

#include <stdio.h> for(i=0;i<n;i++)

om
#include <conio.h> for (j=0;j<m;j++)

.c
{
#define RMax 100

ng
printf("Nhap phan tu a[%d][%d]:
#define CMax 100

co
",i,j);
void main() scanf("%d", pa + i*m +j);

an
}

th
{ ng for(i=0;i<n;i++)
int a[RMax][CMax],n,m, i, j, *pa; {
o
for (j=0;j<m;j++)
du

pa=(int*)a;
printf(“So dong va cot:"); {
u
cu

printf(“%d ", *(pa + i*m +j));


scanf("%d%d",&n,&m); }
printf(“\n");
}
}
www.uit.edu.vn
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nhắc lại: truyền tham số mảng 2 chiều cho hàm
Ví dụ:
int TinhTong( int pa[][100], int n, int m);

om
void main()

.c
{

ng
int a[100][100], n,m;

co
TinhTong(a, n, m);
}

an
int TinhTong( int pa[][100], int n, int m)
{
th
ng
….
o
du

}
Ở ví dụ trên, tham số hình thức của mảng 2 chiều a
u
cu

trong hàm TinhTong khai báo dùng mảng hình thức:


int pa[][100]
Trong thân hàm TinhTong, để truy cập đến phần tử a[i][j]
dùng pa[i][j] www.uit.edu.vn
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tham số hình thức cho hàm là con trỏ
Ví dụ:
int TinhTong( int (*pa)[100], int n, int m);

om
void main()

.c
{

ng
int a[100][100], n,m;

co
TinhTong(a, n, m);
}

an
int TinhTong( int (*pa)[100], int n, int m)
{
th
ng
….
o
du

}
Ở ví dụ trên, tham số hình thức của mảng a trong hàm
u
cu

TinhTong dùng int (*pa)[100] là con trỏ kiểu int[100]


Trong thân hàm TinhTong, để truy cập đến phần tử a[i][j]
dùng pa[i][j]
www.uit.edu.vn
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tham số hình thức cho hàm là con trỏ
Ví dụ:
int TinhTong( int *pa, int n, int m);

om
void main()

.c
{

ng
int a[100][100], n,m;

co
TinhTong(a, n, m);
}

an
int TinhTong( int *pa, int n, int m)
{
th
ng
….
o
du

}
Ở ví dụ trên, tham số hình thức của mảng a trong hàm
u
cu

TinhTong dùng int* pa là con trỏ kiểu int


Trong thân hàm TinhTong, để truy cập đến phần tử a[i][j]
dùng *(pa+i*m+j)
www.uit.edu.vn
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Nâng cao
1) Con trỏ cấp 2

om
2) Mảng con trỏ

.c
ng
3) Con trỏ hàm

co
4) Các phép toán trên con trỏ

an
th
o ng
du
u
cu

www.uit.edu.vn
CuuDuongThanCong.com https://fb.com/tailieudientucntt

You might also like