1. 程式人生 > >C語言的指標型別

C語言的指標型別

目錄

1 指標型別的大小

2 指標型別的作用

正文

指標型別

1. 指標型別的大小

在32位機器上,地址是32個0或1組成的二進位制序列,如果每個位元位都給一個地址位,則32為機能編址的範圍只為512MB,若以4位元組編址,32位機則可以編址4GB。

在64位機器上,有64根地址線,則一個指標變數的大小是8位元組。

對於以下程式碼:

int main(int argc, const char * argv[])
{
    printf("char* : %lu\n",sizeof(char*));
    printf("short* : %lu\n",sizeof(short*));
    printf("int* : %lu\n",sizeof(int*));
    printf("float* : %lu\n",sizeof(float*));
    printf("double* : %lu\n",sizeof(double*));
    printf("long double* : %lu\n",sizeof(long double*));
    return 0;
}
  • 64位機下的輸出為:

-64

  • 32位機下的輸出為:

gcc main.c -m32

問題來了:

為什麼不同型別的指標大小都是一樣的呢?為什麼要這麼設計?

2. 指標型別的作用

  • 指標型別決定了對指標解引用的時候有多大的許可權(能操作幾個位元組)。比如:char*的指標解引用只能訪問一個位元組,而int*的指標解引用就能訪問四個位元組。

看下面的這段程式碼:

int main(int argc, const char * argv[])
{
    int i = 0x11223344;
    int *pi = &i;
    *pi = 0;
    
    int c = 0x11223344;
    char *pc = &c;
    *pc = 0;
    
    return 0;
}

Debug看記憶體變化:

p

發現:

i=0x11223344在執行*pi=0;後全部變為了0

c=0x11223344在執行*pc=0;後只有高位變成了0

說明:int*型別的指標解引用後,操作許可權是4個位元組(int的大小)。

char*解引用後,操作許可權僅為一個位元組。

驗證了:指標型別決定了對指標解引用的時候有多大的許可權(能操作幾個位元組)。

問題又來了:

為什麼高位的44變為0了呢?

這和資料在記憶體中儲存的模式有關。大小端模式

大端模式,是指資料的高位元組儲存在記憶體的低地址中,而資料的低位元組儲存在記憶體的高地址中,這樣的儲存模式有點兒類似於把資料當作字串順序處理:地址由小向大增加,而資料從高位往低位放;這和我們的閱讀習慣一致。

小端模式,是指資料的高位元組儲存在記憶體的高地址中,而資料的低位元組儲存在記憶體的低地址中,這種儲存模式將地址的高低和資料位權有效地結合起來,高地址部分權值高,低地址部分權值低。

  • 指標型別決定了指標指向前或者向後一步有多大距離。

對於以下程式碼:

int main(int argc, const char * argv[])
{
    int n = 10;
    int *pi = &n;
    char *pc = (char*)&n;
    
    printf("&n : %p\n", &n);
    printf("pi : %p\n", pi);
    printf("pi+1 : %p\n", pi+1);
    printf("-----------------------\n");
    printf("pc : %p\n", pc);
    printf("pc+1 : %p\n", pc+1);
    
    return 0;
}

有在64位機下有如下輸出:

pic

可以看到:

pi=pc=&n

但是:

pi+1pc+1 不同

pi+1 - pi = 8

pc+1 - pc = 1

驗證了:指標型別決定了指標指向前或者向後一步有多大距離。