1. 程式人生 > >指標變數的賦值與引用&&二重指標

指標變數的賦值與引用&&二重指標

研究問題:

  1. 函式引數問題(一級指標與二級指標)?區分實參與值參?
  2. 指標變數的賦值和做函式的引數??
  3. 指標到底是變數,還是地址???
  4. 指標變數需要另外開闢記憶體儲存?

要點:

  • 指標變數有時也可以簡稱為”指標”(大多數情況下),它是存放它所指向的變數的地址的變數. 那麼,既然它本身也是一個變數,那就肯定也需要開闢一塊塊空間來存放它本身,這就是二級指標的概念了。
    “指標”和”地址”到底相不相等, 在不同的語義環境中,結論是不同的。
  • 指標變數的值就是某個變數的地址,無需另外開闢記憶體儲存,指標就是按照指標變數的值(某個變數的地址)從而找到儲存單元中的內容!!
    同理,二級指標、多級指標就是按照上一級指標所指向的地址來定址查詢儲存單元中的內容!!

截圖展示區:

    1.
#include<stdio.h>
#include<malloc.h>

void  myMalloc(char  **s)  
{  
     *s=(char  *)  malloc(100);//S指向的是P的地址,所以改變了P所指的記憶體單元.  
}  

int main()  
{  
     char  *p=NULL;  
     myMalloc(&p);    //這裡的p可以得到正確的值了  
     if(p)  free(p);  
}

形參:出現在函式定義中,在整個函式體內都可以使用,實參出現在主調函式中,形參和實參的功能是作資料傳送。

值參:只傳遞數值,在過程(函式)中對之所進行的改動,不會造成原始變數值的改變. 與之相對的是 地址引數,傳的是變數地址,所以在函式中的任何改動都會影響到主函式的實際引數。
2. 指標引用與二級指標

#include<stdio.h>

int f1(int *&q){        //f1(int *q)
    *&q=(int *)0xEEEEEEEE; //q=(int *)0xEEEEEEEE; 
    printf("傳入指標引用的形參\n");
    return 0;
}  

int f2(int **q){
    *q=(int *)0xFFFFFFFF
; printf("傳入指標地址的形參\n"); return 0; } int main() { int i=10; int *p=&i;//相當於int *p;p=&i; printf("%#p\n",p); f1(p); printf("%#p\n",p); f2(&p); printf("%#p\n",p); return 0; }

執行結果:
指標引用與二級指標
3. 指標變數的賦值和做函式的引數
指標變數的賦值
做函式的引數
4. 指標變數需要另外開闢記憶體儲存?

#include<stdio.h>
//一級指標,二級指標,常量 
int main()
{
    int *p;
    int **t; 
    int i=10;
    p=&i;
    t=&p;
    printf("%p\n",p);
    printf("%p\n",&i);
    printf("%p\n",*t);
}

執行結果:
這裡寫圖片描述
PS:地址都一樣,說明沒有另外開闢記憶體來儲存指標變數!!!只是把指標指向了一個記憶體塊而已,自身並不需要記憶體單元儲存!!