III.4 Con trỏ và mảng:

Một phần của tài liệu Lập trình C (Trang 68 - 70)

VI. Các lệnh rẽ nhánh không điều kiện: break, continue, goto:

III.4 Con trỏ và mảng:

Tên mảng không có cặp ngoặc vuông là hằng con trỏ. Đây là con trỏ không thể thay đổi giá trị được, nó luôn trỏ đến phần tử đầu tiên của mảng.

Khi ta khai báo 1 mảng, các phần tử của mảng được sắp xếp tuần tự nhau, phần tử đầu tiên có địa chỉ thấp nhất.

Số học con trỏ: phép tăng / giảm con trỏ làm cho giá trị của nó tăng / giảm một lượng bằng số byte nhớ mà biến được nó trỏ tới chiếm trong bộ nhớ. Từ đó, nếu ta khai báo mảng a có 10 phần tử thì : a=&a[0]; a+1 = &a[1]; ... a+i = &a[i] với i từ 0 đến 9.

Ví dụ : p=a; khi đó để truy cập a[i] ta có thể dùng *(p+i) hoặc p[i] hoặc a[i].

Khi tăng / giảm con trỏ p thì p sẽ trỏ đến phần tử sau / trước so với phần tử ban đầu. Nếu ptr1 và ptr2 là 2 con trỏ trỏ đến 2 phần tử của cùng 1 mảng thì hiệu ptr1 - ptr2 cho ta biết khoảng cách giữa 2 phần tử đó trong mảng. Phép trừ giữa 2 con trỏ chỉ có ý nghĩa khi 2 con trỏ cùng trỏ đến 2 phần tử trong một mảng.

Ngoài việc truy cập phần tử mảng bằng chỉ số, việc truy cập gián tiếp qua con trỏ thì chương trình chạy nhanh hơn.

Ví dụ sai : Xuất các phần tử của một biến mảng int a[10],i;

for(i=0; i<10; i++)

{ printf(“%d \n”, *a); a++;

}

Ví dụ: Xuất các phần tử của một biến mảng int a[10],i,*p;

p=a; //p=&a[0] for(i=0; i<10; i++)

{ printf(“%d \n”, *p); p++;

Khi dùng biến con trỏ p để duyệt các phần tử của mảng, chúng ta có thể tìm chỉ số i thông qua biểu thức i = p - a ;

Truyền mảng một chiều cho hàm :

Đối số có kiểu dữ liệu bất kì nhưng phải là giá trị đơn, vì vậy để truyền cả 1 mảng cho hàm ta phải sử dụng con trỏ. Khi đó ta có thể thay đổi giá trị của mảng ở bên trong hàm và khi thoát ra khỏi hàm, giá trị của mảng có thể thay đổi so với lúc gọi hàm (khác với truyền biến đơn cho hàm). #include <stdio.h> int mang[10],i; int lonnhat(int x[]); main() { for(i=0;i<10;i++) mang[i]=i;

prìnt(“\n So lon nhat = %d “,lonnhat(mang)); return 0;

}

int lonnhat(int x[]) // int lonnhat(int *x) { int j,ln; ln=*x; // ln=x[0]; for(j=0;j<10;j++) if( *(x+j) > ln ) // if ( x[j] > ln ) ln=*(x+j); // ln=x[j]; return ln; }

Khi ta truyền mảng cho hàm nhưng không muốn thay đổi giá trị của mảng thì ta khai báo đầu mảng với từ khoá “const”.

Ví dụ : Nhập một mảng các số nguyên và sắp xếp mảng theo thứ tự tăng dần. #include <stdio.h>

#include <conio.h> #define N 20;

viod nhap(int *), sapxep(int *), xuat(const int *); void main()

{

int a[N];

nhap(a); xuat(a); sapxep(a); xuat(a); }

void nhap(int *x) {

clrscr();

printf(“x[%d]=”,i); scanf(“%d”,&x[i]); } } void sapxep(int *x) { char i, j; int tam;

for(i=0; i<N-1; i++) for(j=0; j<N; j++) if (x[i]>x[j]) { tam=x[i]; x[i]=a[j]; x[j]=tam; } }

void xuat(const int *x) { clrscr(); (adsbygoogle = window.adsbygoogle || []).push({});

for(int i=0; i<N; i++)

printf(“\n x[%d]=%d”, i, x[i]); getch();

}

Một phần của tài liệu Lập trình C (Trang 68 - 70)