khai báo unsigned char *a

oanhpipi

Trứng gà
Mình đang đọc 1 đoạn code chuyển đổi
void Convert (unsigned char *a, unsigned char index, unsigned int number)
{
unsigned char i;
for(i=0; i<index; i++);
{
*(a+i) = number%10;
number = number/10;
};
}

Mình không hiểu unsigned char *a nghĩa là gì. Và sự khác nhau giữa *(a+i) và *a+i
Bạn nào biết giải thích giùm mình với, cảm ơn nhiều. ^^
 
unsigned char *a là khai báo a là một biến pointer
*(a+i) có nghĩa là lấy nội dung của thanh ghi thứ (a+i)
*a + i có nghĩa là lấy nội dung của thanh ghi a cộng với số i

ta ví dụ một mảng gồm 3 phần tử VD[3]
*a = VD <<< a đang truy xuất đến mảng VD và ở vị trí VD[0]
vơi i = 2, ta có:
1/ Lệnh *(a+i) sẽ cho kết quả là ô nhớ VD[0+2] tức là VD[2]
2/ Lệnh *a+i sẽ cho kết quả "VD[0]+i" tức là VD[0] cộng với giá trị i
 

nguyenquoctrung-hhk

Thành Viên PIF
unsigned char *a là khai báo a là một biến pointer
*(a+i) có nghĩa là lấy nội dung của thanh ghi thứ (a+i)
*a + i có nghĩa là lấy nội dung của thanh ghi a cộng với số i
mình có ý kiến tí xíu, hi! nói tới con trỏ thì phải giải thích ở cấp độ địa chỉ sẽ dễ hiểu hơn giải thích ở cấp độ thanh ghi. vì khi nói tới con trỏ là gồm 3 vần đề lưu ý :
1. index (chỉ số)
2. value (giá trị)
3. address (địa chỉ)

để hiểu được pointer (con trỏ) thì phải hiểu được các ký hiệu của nó, giả sử ta khai báo như sau :
int *p;
int x = 5, y = 3, z;

p = &x; // con trỏ đang trỏ tới address(địa chỉ) của biến x;
z = *p; // z sẽ lưu value(giá tri) của address(địa chỉ) của biến x thông qua con trỏ là biến trung gian
trong cách viết trên mảng có một vài cách viết sau :

int arr[n];
int *p; int c;
p = arr; // con trỏ trỏ tới địa chỉ đầu tiên của mảng arr
p = p + i; // tương đương với câu lệnh &arr
c = p[3]; // tương đương vớ câu lệnh c = arr

Hai con trỏ trên cùng một mảng có thể trừ nhau, cho ra số nguyên, chính là khoảng cách giữa hai phần tử của mảng mà hai con trỏ trên đang trỏ đến.
printf(“%d”, pb – pa); // với pb, pa là con trỏ trỏ trên cùng 1 mảng arr

ngoài ra còn một số cách viết khác, mình không nhớ hết nổi, trên đây mình chỉ nêu một vài cách thông dụng nhưng tóm lại bạn có thể hiểu một cách cơ bản như sau :

*p : giá trị của địa chỉ ma con trỏ trỏ tới
p : địa chỉ mà con trỏ trỏ tới
&p : địa chỉ của con trỏ.

tuy nhiên với con trỏ có hai dạng : động và tĩnh
tĩnh : con trỏ sẽ trỏ tới địa chỉ của một biến nào đó trong chương trình (kể cả mảng, vì mảng là tập hợp nhiều biến)
động : trong bộ nhớ máy tính sẽ cấp phát cho nó một dụng lượng bộ nhớ để nó sử dụng như một biến, sau khi thực thi xong, sẽ giải phóng vùng nhớ, trả lại bộ nhớ cho máy tính. mục đích của viêc này là để tối ưu tài nguyên bộ nhớ.

ví dụ về con trỏ động như sau :

//dùng hàm malloc trong thư viện <stdlib.h>
int *px; // Khai báo con trỏ px
px = (int*) malloc(10*sizeof(int)); // Cấp phát 10 ô nhớ kiểu int
free (px) ; // giải phóng vùng nhớ cho con trỏ px dùng hàm free
 
Top