ນຳສະເໜີ pointer ພື້ນຖານ ໃນພາສາ C

ສະບາຍດີເດບຫຼົງທາງທັງຫຼາຍ, ຕາມທີສັນຍາກັນທິດກ່ອນ ວາຈະມາ ອະທິບາຍກ່ຽວກັບ Pointer ແຕ່ພື້ນຖານຈົນເຖິງການໃຊ້ Pointer ແບບ 2 ມິຕິ ຫຼື 2-dimension ນັ້ນເອງ. ເນື່ອງຈາກສີ່ງທີ່ຈະອະທິບາຍນັ້ນມັນຍາວພໍປະມານ ໃນການລຽງເນື້ອຫາບົດຄວາມ ກໍ່ເລີຍຈະແບ່ງອອກເປັນ ep ກັນເອົາເນາະ. ເອົາເປັນວ່າມາເລີ່ມຈາກ ep.1 ນຳສະເໜີ pointer ພື້ນຖານ ໃນພາສາ C.

ໂດຍທົ່ວໄປແລ້ວ ການປະກາດ variable ແບບທົ່ວໄປທີມີ type ເປັນ char, short, int ເປັນຕົ້ນ. ທີມີການປະກາດດັ່ງນີ້:

int main(void){
    char a = ‘a’;
    short b = 3;
    int c = 33;
    a = ‘c’;
    b = 4;
    c = 44;
}
ທຳອິດ ແມ່ນເຮົາປະກາດຕົວປ່ຽນ ທີອາດຈະ initial ຄ່າໄປກ່ອນ ຫຼື ຕາມຫຼັງກໍ່ຕາມ. ເຮົາອາດຈະມອງເຫັນແບບ ຊື່ຕົສປ່ຽນ, ປະເພດຕົວປ່ຽນ ແລະ ຄ່າຂອງຕົວປ່ຽນ, ໂດຍທີເຮົາບໍ່ສົນໃຈວ່າຕົວປ່ຽນຂອງເຮົາແມ່ນມີ address ທີ່ຖືກຈັດເກັບໄວ້ແບບ Random ທີຢູ່. ເພາະການປະກາດແບບທົ່ວໄປນີ້ແມ່ນ 1 ຕົວປ່ຽນ ຕໍ່ 1 ຄ່າ ໂດຍທົ່ວໄປ. ຕົວຢ່າງ: c ເກັບຄ່າໄດ້ພຽວໂຕດຽວຄື 33, ແລະ ເມື່ອປ່ຽນຄ່າໄໝ່ ຄ່າເກົ່າກໍ່ຈະຫາຍໄປ. ເພາະ 1 ຕົວປ່ຽນ ມີ 1 ທີ່ຢູ່ທີຊີ້ໄປຍັງ ຄ່າຂອງຕົວປ່ຽນຕາມຂະໜາດຂອງປະເພດຕົວປ່ຽນ (1, 2, 4 bytes). ສະຫຼຸບແລ້ວ ການທີປະກາດຕົວປ່ຽນແບບນີ ເຮົາບໍ່ຈຳເປັນຕ້ອງສົນໃຈ address ຂອງມັນ ເພາະ address ຂອງຕົວປ່ຽນໄດໜື່ງຈະບໍ່ມີການປ່ຽນແປງ.
ແລ້ວໃນເລື່ອງຂອງການຈັດເກັບຂໍ້ມູນ. ດັ່ງທີ່ີຮຸ້ຈັກກັນທຸກຄົນແລ້ວວ່າ ຄອມພີວເຕີ່ ມັນຈັດເກັບຂໍ້ມູນແບບ 0 1, ເອົາງ່າຍໆຄື ໃຫ້ເຂົ້າໃຈວ່າ memory ມັນຈະແບ່ງອອກເປັນລ້ານໆ slot, ແຕ່ລະ slot ມັນບັນຈຸປະຈຸໄຟຟ້າຫຍັງຈັກຢ່າງ ທີມີຄ່າຢູ່ 2 ປະເພດຕ່າງກັນ ແລະ ເມື່ອ memory ໃນ block ນັ້ນໆ ຖືກປະມວນຜົນ ມັນກໍ່ຈະແປງຈາກກະແສໄຟ ທີມີ 2 ຄ່າຕ່າງກັນນັ້ນ ໄປເປັນ 0 ແລະ 1, ເຊີ່ງເອີ້ນວ່າ ເລກຖານສອງ ແລະ ແຕ່ລະເລກ 0 ຫຼື 1 ເອີ້ນວ່າ bit. ແລະ ນີ້ຄືຈຸດເລີ່ມຕົ້ນຂອງ ຄອມພີວເຕີ່. ໃນເມື່ອ bit ຖືກປະມວນຜົນໃນທາງ software ແລ້ວ, ເພື່ອໃຫ້ block ມີຂະໜາດທີສາມາດເກັບ ຕົວເລກ ຫຼື ຕົວໜັ່ງສືໄດ້ ຕາມ ASCII, ສະນັ້ນເຂົາເຈົ້າຈື່ງ ສ້າງຫົວໜ່ວນທີຊື່ວ່າ byte ຂື້ນ ທີປະກອບໄປດ້ວຍ 8 bits. ແຕ່ວ່າ 1 byte ປະກອບໄປດ້ວຍ 8 bits, ເຊີ່ງມັນບໍ່ພໍໃນການຈັດເກັບຕົວເລກຂະໜາດໃຫຍ່ກວ່າ 255 ຂື້ນໄປ ດັ່ງນັ້ນຈື່ງປາກົດມີ short (2 bytes) ຫຼື int16, int (4 bytes) ຫຼື int 32, ແລະ int64 ທີ support ໃນ OS 64 bit ຂື້ນໄປ.
ສະຫຼຸບແລ້ວ, ຖ້າຕົວປ່ຽນ int16, int32 ແລະ int64 ຢາກຈະອ່ານຂໍ້ມູນຂອງມັນຈາກ memory ແລະ ຈະອ່ານເທື່ອລະ 2, 4, 8 bytes ຫຼື 16, 32, 64 bits ຕໍ່ຕົວປ່ຽນ ຕາມລຳດັບ ກ່ອນທີຈະນຳໄປປະມວນຜົນຕໍ່ໄປ.
ອາໆໆ ໄປຮອດໃສກັນລະ ກັບມາດຽວນີ້ເນາະ, ດ້ວຍການທົບທວນ ຊື່ ປະເພດ ແລະ ຄ່າຂອງຕົວປ່ຽນ ຂອງການປະກາດຕົວປ່ຽນທຳມະດາ. ແລ້ວ ເຮົາຈະກ້າວເຂົ້າສູ່ pointer ນຳກັນ ໂດຍການເພີ່ມ address ເຂົ້າມາ.
ໂດຍທຳມະດາແລ້ວ  pointer ກໍ່ຄືການ ນຳເອົາຫຼາຍໆ ຕົວປ່ຽນມາໄວ້ນຳກັນ ແຕ່ລະຕົວປ່ຽນມີ 1 ຊື່ 1 ປະເພດອັນດຽວກັນ ແລະ ຄ່າຂອງຕົວປ່ຽນແຕ່ກຕ່າງກັນ ຫຼື ອາກຄືກັນ, ແລ້ວ ເອົາມາໂຮມໄວ້ນຳກັນໃນ 1 ຕົວປ່ຽນ ເປັນປະເພດ pointer ຫຼື ແບບ array ນັ້ນເອງ. ດັ່ງໃນຮູບ. ຖ້າຈີນຕະນາການໃນແງ່ memory ໂດຍສົມມຸດເຮົາກຳລັງຍືນຢູ່ຂັນໄດ, pointer ຄືຕົວຊີ້ວ່າຕອນນີ້ເຮົາກຳລັງຢືນຢູ່ຂັ້ນທີເທົ່າໄດ ແລະ ໃນຂັ້ນນັ້ນມີຂໍ້ມູນຫຍັງຢູ່ ເຮົາສາມາດແປງຂໍ້ມູນໄດ້ ຖ້າຕ້ອງການ, ເຮົາສາມາດຍ່າງຂື້ນລົງ ຫຼື ໂດດ ຂື້ນລົງໄດ້ຕາມທີຕ້ອງການ ຕາມໄດທີຍັງມີຂັ້ນໄດ ເຫຼືອຢູ່. ແລະ ຈີນຕະນາການວ່າ ເຮົາເປັນມະນະ level 1, 2, 4 (char, short, int) ເຮົາສາມາດ ເລື່ອງໄປມາໄດ້ເທື່ອລະ 1, 2, 4 ຂັ້ນ ແລະ ຈັດການຂໍ້ມູນໄດ້ໃນຈຳນວນ 1, 2, 4 ຂັນໃນທາງໜ້າເຮົາ ຕາມລຳດັບ. ແລະ ຖ້າວ່າເຮົາເປັນມະນຸດ level 4 ເຮົາສາມາດໂດດເທື່ອ 1 ສາມາດໄປໄດ້ 4 ຂັ້ນ ແລະ ບໍ່ສາມາດໄປໄດ້ 1, ຫຼື 2 ຂັ້ນ. ແຕ່ສາມາດປ່ຽນ level ໃຫ້ມາເປັນ 1 ຫຼື 2 ໄດ້ ແຕ່ກໍລະນີແບບນີ້ບໍມັກເກິດຂື້ນ.

 

ໂຄງສ້າງຂອງ pointer

ທຳອິດ ໃຫ້ເຂົ້າໃນກັນກ່ອນວ່າ pointer ເປັນປະເພດຕົວປ່ຽນທີສາມາດ cast ເປັນປະເພດໄດກໍ່ໄດ້ ເຊັ້ນ: ຈາກ char pointer ສາມາດ cast ໄປເປັນ int pointer ໄດ້ ໂດຍທີມັນຈະແຕກຕ່າງກັນບ່ອນ ການເພີ່ມຂື້ນຂອງ pointer address ຈະມີຂະໜາດໄປຕາມ size ຂອງແຕ່ລະ ປະເພດຕົວປ່ຽນ 1, 2, 4 ເປັນຕົ້ນ. pointer ບໍ່ເປັນປະເພດຕົວປ່ຽນ pointer ເປັນພຽງໂຄງສ້າງໃນການຈັດເກັບຂໍ້ມູນ ແບບ address ກັບ value, 1 address ມີ 1 byte, ptr++ ເປັນການເລື່ອນ pointer ໄປຍັງຕຳເໜ່ງຖັດໄປ ແຕ່ບໍໄດ້ໝາຍວ່າ ໃນທາງ address ມັນຈະເພີ່ມຂື້ນ ++ (1 adress) ແຕ່ຈະເພີ່ມຂື້ນຕາມຂະໜາດຂອງປະເພດຂອງ pointer. pointer ບໍ່ສາມາດບອກຂະໜາດຂອງມັນຄືກັນ array ໄດ້ ເພາະ pointer ເປັນພຽງ ລູກສອນທີຊີ້ໄປຍັງ address ບ່ອນໄດໜື່ງ ແລ້ວ ລໍຖ້າຄຳສັ່ງ ປ່ຽນຂໍ້ມູນ, ຍ້າຍຕຳແໜ່ງຂອງ pointer ເພື່ອຊີ້ໄປຍັງຂໍ້ມູນບ່ອນໄໝ່ ແລະ ສາມາດ ຍ້າຍໄປໃສກະໄດ້ ເທົ່າທີຈຸດນັ້ນຍັງມີ memory block ເຫຼືອຢູ່ ແລະ ສາດມາດປ່ຽນຄ່າໃນ block ນັ້ນໄດ້ ພຽງແຕ່ ເພີ່ມຂໍ້ມູນລົງໄປ. ແຕ່ຖ້າຫາກມີການ ເລື່ອງໄປຍັງ address ທີ່ເກີນກ່ວາທີເຮົາປະກາດໄວ້ ແລະ ປ່ຽນຄ່າໃນຈຸດນັ້ນ ແມ່ນສາມາດປ່ຽນອ່ານໄດ້ ແຕ່ ມັນອາດຈະສົ່ງຜົນກະທົ່ບ ຖ້າ address ບ່ອນນັ້ນ ກຳລັງຖືກໃຊ້ຢູ່.

 

ເອົາເປັນວ່າ ພໍ່ກ່ອນເນາະ ສຳຫຼັບ ນຳສະເໜີ pointer ພື້ນຖານ ໃນພາສາ C, ເພາະຄຸນສົມບັດຂອງ pointer ປະມານທີບັນລະຍາຍມາ ຖ້າຂາດຫຍັງໄປ ສຳຫຼັບ ພື້ນຖານທິດສະດີ ຈະພະຍາຍາມ ເພີ່ມເຂົ້າໃນ ep ຕໍ່ໄປ ເພື່ອໃຫ້ຮູ້ ແລ້ ເຂົ້າໃຈເຖີງແກ່ນແທ້ຂອງ pointer ^^.

ຂອບໃຈທຸກຄົນທີ່ເຂົ້າມາອ່ານເນາະ ຫວັງວ່າຈະບໍ່ຫຼົງທາງກັນອີກລະເນາະ ເພາະເບີ່ງແຕ່ລະຄົນຫຼັງຈາກອ່ານຈົບ ກະຄືສິບໍ່ຮູ້ທັນຮູ້ໂຕວ່າ ກຳລັງຫຼົງທາງກັນໄປໃຫຍ່ກ່ວາເກົ່າ ^^

Share via

Leave a Reply

Specify GooglePlus Client ID in Super Socializer > Social Login section in admin panel for GooglePlus Login to work