Tải bản đầy đủ (.ppt) (29 trang)

Kieu con tro docx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (531.53 KB, 29 trang )

1
CHƯƠNG 6: KIỂU CON TRỎ

6.1 Con trỏ và địa chỉ
6.2 Khai báo con trỏ, các phép toán trên con trỏ
6.3 Con trỏ và mảng một chiều
6.4 Con trỏ và mảng nhiều chiều
6.5 Mảng con trỏ
6.6 Cấp phát bộ nhớ động
2
Khái niệm con trỏ


Một con trỏ là một biến chứa địa chỉ ô nhớ. Địa
chỉ này là vị trí của một đối tượng khác trong bộ
nhớ.

Ví du:
float x; //x là một biến có kiểu float
x=12.5; //x có giá trị là 12.5
Và lúc này, biến x chiếm 4 ô nhớ liên tiếp, giả sử
mỗi ô nhớ có kích thước 1 byte.
3
Con trỏ và địa chỉ
Phép lấy địa chỉ của 1 biến

Kí hiệu: &

Cách sử dụng:&<Tên biến>

Ví dụ: int *pi=&a; // pi giữ địa chỉ của các biến nguyên a


Phép toán lấy giá trị tại một địa chỉ mà một con trỏ đang trỏ
tới
Kí hiệu: *
Cách sử dụng: *<Tên con trỏ>
Ví dụ:
int a= 10; // biến a có giá trị 10
int *pi;
pi =&a; //pi giữ địa chỉ của biến a
*pi là giá trị của a và bằng 10
4
Con trỏ và địa chỉ

a
25
x
y
25
int a=25, x;
int *y;
x=a;
y=&a;
y
Ví dụ 1:
5
Con trỏ và địa chỉ
int a, *p;
a=25;
p=&a;
m=*p ;


Cho biết Giá trị của m ?
Ví dụ 2:
6
Con trỏ và địa chỉ
Lưu ý:
Khi gán địa chỉ của 1 biến cho 1 biến con trỏ, mọi sự
thay đổi trên nội dung ô nhớ con trỏ chỉ tới sẽ làm giá trị
của biến thay đổi theo.
Khi ta khai báo:
int a=10;int *pi;
pi=&a; // pi giữ địa chỉ biến a
*pi=*pi +2;
sẽ làm cho biến a có giá trị là 12
Lưu ý: Việc sử dụng và thao tác trên giá trị tại địa chỉ
của con trỏ chỉ được thực hiện sau khi con trỏ đã có địa
chỉ
7
Con trỏ và địa chỉ
int main()
{
int a,b,*pa,*pb;
a=2;b=3;
printf("Gia tri cua bien a %d, gia tri cua bien b %d",a,b);
pa=&a;
pb=&b;
printf("\nNoi dung cua o nho con tro pa tro toi %p",*pa);
printf("\nNoi dung cua o nho con tro pb tro toi %p",*pb);
*pa=20;
*pb=30;
printf("\nGia tri cua bien a sau khi thay doi la %d",a);

printf("\nGia tri cua bien b sau khi thay doi la %d",b);
getch();
}
8
C
9
Khai báo con trỏ
Khai báo
Giống như mọi biến khác, biến con trỏ muốn sử dụng
cũng cần phải được khai báo
Ví dụ

ch1 và ch2 là biến con trỏ, trỏ tới vùng nhớ kiểu
char (1 byte).

p1 là biến con trỏ, trỏ tới vùng nhớ kiểu int (4 bytes)
còn p2 là biến kiểu int bình thường.
<kiểu dữ liệu> *<tên biến con trỏ>;
char *ch1, *ch2;
int *p1, p2;
10
Khai báo con trỏ
Sử dụng từ khóa typedef
Ví dụ
typedef <kiểu dữ liệu> *<tên kiểu con trỏ>;
<tên kiểu con trỏ> <tên biến con trỏ>;
typedef int *pint;
int *p1;
pint p2, p3;
11

Con trỏ NULL
Khái niệm
Con trỏ NULL là con trỏ không chứa địa chỉ nào.
Khác với con trỏ chưa được khởi tạo.
NULL
int n;
int *p1 = &n;
int *p2;
int *p3 = NULL;
12
Con trỏ và mảng 1 chiều
Giữa mảng và con trỏ có một sự liên hệ rất chặt chẽ:

Những phần tử của mảng được xác định bằng chỉ số trong
mảng và cũng có thể được xác định qua biến con trỏ.

Tên của một mảng tương đương với địa chỉ phần tử đầu
tiên của nó, tương tự một con trỏ tương đương với địa chỉ
của phần tử đầu tiên mà nó trỏ tới.
Kiểu mảng Ví dụ Kiểu Con trỏ Ví dụ
&<Tên mảng>[0] &A[0] hoặc A <Tên con trỏ > p
&<Tên mảng> [<Vị trí>] &A[i] <Tên con trỏ> + <Vị trí> P+i
<Tên mảng>[<Vị trí>] A[i] *(< Tên con trỏ > + <Vị
trí>)
*(p+i)
13
Con trỏ và mảng 1 chiều

p được gán địa chỉ của phần tử đầu tiên của mảng ch.
p = ch;


Để lấy giá trị phần tử thứ 3 trong mảng ch, ta dùng một trong
2 cách sau: ch[2] hoặc *(p+2).
Ví dụ 1:
14
Con trỏ và mảng 1 chiều
Numbers
int Numbers[5];
p= Numbers;
int *p;
p
*p = 10;
10
p
p++;
*p = 20;
20
p = &numbers[2];
p
*p = 30;
20
p
p
30 50
p = numbers;
*(p+4) = 50;
p
15
Con trỏ và mảng 1 chiều
void nhapmang(int *a,int &n)

{ int i;
printf("nhap so phan tu cua
mang");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("a[%d]=",i);
scanf("%d",a+i);
}
}
void xuatmang(int *a,int n)
{ int i;
printf("\nmang vua nhap la:");
for(i=0;i<n;i++)
printf("%d",*(a+i));
}
int tong(int *a,int n)
{
int i,t;
t=0;
for(i=0;i<n;i++)
t=t+*(a+i);
return t;
}
int main()
{
int a[20],k,i;
nhapmang(a,k);
xuatmang(a,k);
printf("tong la:%d",tong(a,k));

getch();
}
16
Con trỏ và mảng 2 chiều
Để lần lượt duyệt trên các phần tử của mảng 2 chiều ta có thể
dùng con trỏ như sau:
float *pa, a[2][3];
pa=(float*)a;
17
Con trỏ và mảng 2 chiều
int main()
{ int a[4]
[5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,1
5,16,17,18,19,20};
int *p,i,j;
p=(int*)a;
printf("Noi dung cua mang a ban
dau la\n");
for(i=0;i<4;i++)
for(j=0;j<5;j++)
printf("%d",a[i][j]);

printf("\nNoi dung cua con tro p
ban dau la\n");
for(i=0;i<20;i++)
printf("%d",*(p+i));
for(i=0;i<20;i++)
*(p+i)=*(p+i)+1;

printf("\nNoi dung cua mang a

sau khi tang len 1 la\n");
for(i=0;i<4;i++)
for(j=0;j<5;j++)
printf("%d",a[i][j]);

printf("\nNoi dung cua con tro p
sau khi tang len 1 la\n");
for(i=0;i<20;i++)
printf("%d",*(p+i));
getch();
}
18
Các phép toán trên con trỏ
Có 4 phép toán liên quan tới con trỏ và địa chỉ:
-
Phép gán
-
Phép tăng giảm địa chỉ
-
Phép truy cập bộ nhớ
-
Phép so sánh
19
Các phép toán trên con trỏ
20
Các phép toán trên con trỏ
21
Các phép toán trên con trỏ
22
Mảng con trỏ


Mỗi biến con trỏ là một biến đơn. Ta có thể tạo
mảng của các con trỏ với mỗi phần tử của mảng
là một con trỏ.

Cú pháp:
<Kiểu dữ liệu> *Tên mảng con trỏ [số phần tủ];
23
Mảng con trỏ

p
a
100
int *p[5];
int a=6;
p[0] = &a;
100
p[2] = p[0];
100
6
int b;
b
b = *p[0];
6
P[0] P[1] P[2] P[3] P[4]
24
Cấp phát bộ nhớ động
Cấp phát vùng nhớ cho biến con trỏ:
Các hàm: malloc(), calloc(), free()…
25

Cấp phát bộ nhớ động
Giải phóng vùng nhớ cho biến con trỏ

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×