Kotlin Xotira manzili va ko'rsatkichlar

Kotlin/JVM ko'rsatkichlarni qo'llab-quvvatlamaydi va shuning uchun (sun.misc.Unsafe klassi bilan ba'zi jiggery-pokeriyadan tashqari) o'zgaruvchining manzilini olishning hech qanday usuli yo'q. Biroq, hozirda (2018-yilning yanvar oyida) chiqarilishdan oldingi versiyasi sifatida mavjud bo'lgan Kotlin/Native C kodi bilan o'zaro ishlashi uchun ko'rsatgichlarni qo'llab-quvvatlaydi. Quyidagi dastur mahalliy uyada ajratilgan o'zgaruvchining manzilini qanday olish mumkinligini ko'rsatadi. Muayyan manzilda o'zgaruvchini ajratish mumkin emasdek ko'rinadi.

Quyidagi bilan ishlaydi:

// Kotlin Native v0.5
import kotlinx.cinterop.*
fun main(args: Array<String>) {
  val intVar = nativeHeap.alloc<IntVar>()
  intVar.value = 42
  with(intVar) {
    println("Qiymati $value, uning manzili $rawPtr")
  }
  nativeHeap.free(intVar)
} 
Qiymat 42, uning manzil 0xc149f0

Ko’rsatkich - xotira uyasining unikal (xotira) manzilini saqlaydigan o’zgaruvchi. Ko’rsatkich operativ xotiradagi biron-bir o’zgaruvchi mavjud bo’lishi mumkin bo’lgan biron-bir joyni belgilaydi. Ko’rsatkichlarning qiymatlarini o’zgartirishni shunday turli variantlarda qo’llash mumkinki, bu dasturning moslashuvchanligini oshiradi. Bu holda ko’rsatkichlar noaniq qiymatga ega bo’ladi. Ko’rsatkichlar ta’riflanganda ularning turlari ko’rsatilishi shart. Ko’rsatkichlarni inisializasiya qilish, ya’ni boshlang’ich qiymatlarini kiritish mumkin. Ma’lum turdagi biron-bir o’zgaruvchi manzili yoki NULL qiymat dastlabki qiymat bo’lishi mumkin. Ko’rsatkichlarga boshlang’ich maxsus NULL qiymati berilsa, bunday ko’rsatkich bo’sh ko’rsatkich deb ataladi. Biron-bir o’zgaruvchi manzilini olish hamda uni ko’rsatkichga qiymat sifatida berish uchun «&» operatori qo’llanadi.

Ko’rsatkichlar xossalari

Ko’rsatkichlar ustida o’tkaziladigan operasiyalar. Ko’rsatkichlar ustida unar operasiyalar bajarish mumkin: inkrement (++) va dekrement (--) operasiyalarini bajarishda, ko’rsatkich qiymati ko’rsatkich murojaat qilgan tur uzunligiga ko’payadi yoki kamayadi. Qo’shish va ayirish binar operasiyalarida ko’rsatkich va int turining qiymati ishtirok etishi mumkin. Bu operasiya natijasida ko’rsatkich qiymati dastlabkisidan ko’rsatilgan elementlar soniga ko’proq yoki kamroq bo’ladi.

Misol:

// Kotlin Native v0.5
import kotlinx.cinterop.*
fun main(args: Array<String>) {
  val intVar = nativeHeap.alloc<IntVar>()
  intVar.value = 42+1
  with(intVar) {
    println("Qiymati $value, uning manzili $rawPtr")
  }
  nativeHeap.free(intVar)
}
Qiymat 42, uning manzil 0xc149f4

Ayirish operasiyasida bitta turga mansub bo’lgan ikkita ko’rsatkich ishtirok etishi mumkin. Operasiya natijasi int turiga ega hamda kamayuvchi va ayiruvchi o’rtasidagi dastlabki tur elementlarining soniga teng, bundan tashqari agar birinchi manzil kichikroq bo’lsa, u holda natija manfiy qiymatga ega bo’ladi.