1. 程式人生 > >JNI之C語言多級指標剖析

JNI之C語言多級指標剖析

一級指標

假設在記憶體中定義一個一級指標。

#include <stdio.h>
#include <stdlib.h>
 main() {

        int i = 3; 
        int * j;    //定義一級指標j
        j = &i;     //把i的地址賦給指標j

        printf("%d\n", i);      //列印整形變數i的值       
        printf("%#x\n", &i);    //列印整形變數i的地址
        printf("%#x\n", j);     //列印指標j的值,即變數i的地址(&i)
printf("%#x\n", &j); //列印指標j定義時系統所分配的地址(指標j的地址) printf("%d\n", *j); //列印指標j的值所對應地址上的值(i的值) system("pause"); //讓執行視窗暫停 }


總結如下(理解就收穫了):

  • 指標的值存放的都是地址。
  • 指標即地址,這個地址是指的是系統分配給他的地址
  • 在定義指標(int * j)還未程式碼賦值之前,系統做了2件事
    • 一是系統為這個一級指標分配了一個地址,這就是這個指標的地址。
    • 二是系統為這個一級指標賦了初值,這就是指標的值。這個初值是相對固定的,即他與系統以及配置相關,同一臺電腦每次賦的初值都是一樣的,不同電腦值就不一樣了(涉及到演算法問題)
  • j是一級指標,他的值就是賦值給他的地址
  • &j是一級指標自身的地址,即定義時系統所分配給他的地址
  • *j是一級指標j的值所對應地址上的值(i的值)

二級指標

在上面的基礎之上定義一個二級指標

int ** k;   //定義二級指標k,到這一步止電腦同樣做了上述的2件事
k = &j;     //給二級指標賦值,值是一級指標的地址

printf("%#x\n", &j);    //一級指標j的地址
printf("%#x\n", k);     //二級指標k的值
printf("%#x\n", &k);    //二級指標k的地址
printf("%#x\n"
, *k); //二級指標k的值所對應地址上的值(一級指標的值,即整形變數i的地址) printf("%d\n", **k); //二級指標k的值所對應地址上的值(一級指標的值),再一級指標的值所對應地址上的值(整形變數i的值)

這裡比較重要的就是最後2點,理解 *k, **k 非常重要

三級指標

int *** m;  //定義三級指標m
m = &k;     //給三級指標賦值

可總結得到(注:指標的值存放的都是地址)

  • m –> 是三級指標m的值
  • *m –> 是二級指標k的值
  • **m –> 是一級指標j的值
  • ***m –> 是整形變數i的值