Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Con trỏ và mảng.






Trong thự c tế, tê n củ a mộ t mả ng tư ơ ng đ ư ơ ng vớ i đ ị a chỉ phầ n tử đ ầ u tiê n củ a nó, giố ng như mộ t con trỏ tư ơ ng đ ư ơ ng vớ i đ ị a chỉ củ a phầ n tử đ ầ u tiê n mà nó trỏ tớ i, vì vậ y thự c tế chú ng hoà n toà n như nhau. Ví dụ, cho hai khai bá o sau:

int numbers [20];
int * p;

lệ nh sau sẽ hợ p lệ:

p = numbers;

Ở đ â y p numbers là tư ơ ng đ ư ơ ng và chú ng có cũ ng thuộ c tí nh, sự khá c biệ t duy nhấ t là chú ng ta có thể gá n mộ t giá trị khá c cho con trỏ p trong khi numbers luô n trỏ đ ế n phầ n tử đ ầ u tiê n trong số 20 phầ n tử kiể u int mà nó đ ư ợ c đ ị nh nghĩ a vớ i. Vì vậ y, khô ng giố ng như p - đ ó là mộ t biế n con trỏ bì nh thư ờ ng, numbers là mộ t con trỏ hằ ng. Lệ nh gá n sau đ â y là khô ng hợ p lệ:

numbers = p;

bở i vì numbers là mộ t mả ng (con trỏ hằ ng) và khô ng có giá trị nà o có thể đ ư ợ c gá n cho cá c hằ ng.

Vì con trỏ cũ ng có mọ i tí nh chấ t củ a mộ t biế n nê n tấ t cả cá c biể u thứ c có con trỏ trong ví dụ dư ớ i đ â y là hoà n toà n hợ p lệ:

// more pointers #include < iostream.h> int main (){ int numbers[5]; int * p; p = numbers; *p = 10; p++; *p = 20; p = & numbers[2]; *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n< 5; n++) cout < < numbers[n] < < ", "; return 0; } 10, 20, 30, 40, 50,

Trong bà i " mả ng" chú ng ta đ ã dù ng dấ u ngoặ c vuô ng đ ể chỉ ra phầ n tử củ a mả ng mà chú ng ta muố n trỏ đ ế n. Cặ p ngoặ c vuô ng nà y đ ư ợ c coi như là toá n tử offset và ý nghĩ a củ a chú ng khô ng đ ổ i khi đ ư ợ c dù ng vớ i biế n con trỏ. Ví dụ, hai biể u thứ c sau đ â y:

a[5] = 0; // a [offset of 5] = 0 *(a+5) = 0; // pointed by (a+5) = 0

là hoà n toà n tư ơ ng đ ư ơ ng và hợ p lệ bấ t kể a là mả ng hay là mộ t con trỏ.

Khở i tạ o con trỏ

Khi khai bá o con trỏ có thể chú ng ta sẽ muố n chỉ đ ị nh rõ rà ng chú ng sẽ trỏ tớ i biế n nà o,

int number;
int *tommy = & number;

là tư ơ ng đ ư ơ ng vớ i:

int number;
int *tommy;
tommy = & number;

Trong mộ t phé p gá n con trỏ chú ng ta phả i luô n luô n gá n đ ị a chỉ mà nó trỏ tớ i chứ khô ng phả i là giá trị mà nó trỏ tớ i. Bạ n cầ n phả i nhớ rằ ng khi khai bá o mộ t biế n con trỏ, dấ u sao (*) đ ư ợ c dù ng đ ể chỉ ra nó là mộ t con trỏ, và hoà n toà n khá c vớ i toá n tử tham chiế u. Đ ó là hai toá n tử khá c nhau mặ c dù chú ng đ ư ợ c viế t vớ i cù ng mộ t dấ u. Vì vậ y, cá c câ u lệ nh sau là khô ng hợ p lệ:

int number;
int *tommy;
*tommy = & number;

Như đ ố i vớ i mả ng, trì nh biê n dị ch cho phé p chú ng ta khở i tạ o giá trị mà con trỏ trỏ tớ i bằ ng giá trị hằ ng và o thờ i đ iể m khai bá o biế n con trỏ:

char * terry = " hello";

trong trư ờ ng hợ p nà y mộ t khố i nhớ tĩ nh đ ư ợ c dà nh đ ể chứ a " hello" và mộ t con trỏ trỏ tớ i kí tự đ ầ u tiê n củ a khố i nhớ nà y (đ ó là kí tự h') đ ư ợ c gá n cho terry . Nế u " hello" đ ư ợ c lư u tạ i đ ị a chỉ 1702, lệ nh khai bá o trê n có thể đ ư ợ c hì nh dung như thế nà y:

cầ n phả i nhắ c lạ i rằ ng terry mang giá trị 1702 chứ khô ng phả i là 'h' hay " hello" .

Biế n con trỏ terry trỏ tớ i mộ t xâ u kí tự và nó có thể đ ư ợ c sử dụ ng như là đ ố i vớ i mộ t mả ng (hã y nhớ rằ ng mộ t mả ng chỉ đ ơ n thuầ n là mộ t con trỏ hằ ng). Ví dụ, nế u chú ng ta muố n thay kí tự 'o' bằ ng mộ t dấ u chấ m than, chú ng ta có thể thự c hiệ n việ c đ ó bằ ng hai cá ch:

terry[4] = '! ';
*(terry+4) = '! ';

hã y nhớ rằ ng viế t terry[4] là hoà n toà n giố ng vớ i viế t *(terry+4) mặ c dù biể u thứ c thô ng dụ ng nhấ t là cá i đ ầ u tiê n. Vớ i mộ t trong hai lệ nh trê n xâ u do terry trỏ đ ế n sẽ có giá trị như sau:






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.