指針入門

sizeof 運算符

sizeof運算符,能給出某個類型或變量在內(nèi)存中所占據(jù)的字節(jié)數(shù)。

  • sizeof(int)

  • sizeof(i)

示例代碼:

#include <stdio.h>
int main()
{
    int a;
    a = 6;
    printf("sizeof(int)=%ld\n", sizeof(int));
    printf("sizeof(a)=%ld\n", sizeof(a));
    return 0;   
}

程序輸出:
sizeof(int)=4
sizeof(a)=4

注:1byte=8bit,則一個整型要占用4byte(32bit)內(nèi)存。

& 運算符

獲取變量的地址,它的操作數(shù)必須是變量

#include <stdio.h>
int main()
{
    int i = 0;
    printf("0x%x\n", &i);  //0x22fe4c
    printf("%p\n", &i);    //000000000022FE4C
    
    
    printf("%lu\n", sizeof(int)); //4 整型4字節(jié)
    printf("%lu\n", sizeof(&i));  //8 32位架構(gòu)下地址使用4字節(jié)存儲、64位架構(gòu)下地址使用8字節(jié)存儲
    return 0;
}
  • & 操作符不能操作非變量
#include <stdio.h>
int main()
{
    int i = 0;
    int p;
    p = (int)&i;
    p = (int)&(i+p); //[Error] lvalue required as unary '&' operand
    return 0;
}
  • 相鄰變量的地址,有什么特點?
#include <stdio.h>
int main()
{
    int i = 0;
    int p;

    printf("%p\n", &i); //0022FE4C
    printf("%p\n", &p); //0022FE48

    return 0;
}

i與p相差4(整型變量占用4字節(jié))
i地址高于p(C語言內(nèi)存模型,本地變量在堆棧中分配,變量由高至低分配。)

&操作符與數(shù)組

  • 數(shù)組的地址
  • 數(shù)組單元的地址
  • 相鄰的數(shù)組單元的地址
#include <stdio.h>
int main()
{
    int a[10];

    printf("%p\n", &a);     //數(shù)組的地址
    printf("%p\n", a);      //不寫&

    printf("%p\n", &a[0]);
    printf("%p\n", &a[1]);

    return 0;
}

程序輸出:
0022FE20
0022FE20
0022FE20
0022FE24

  • &a == a == &a[0],獲取數(shù)組第一個元素的三種方式。
  • a[0]與a[1] 之間差4字節(jié),相鄰的數(shù)組單元的差距都是4字節(jié)。

如何保存地址的變量?

  • *是一個單目運算符,用來訪問指針的值所表示的地址上的變量。
  • 可以做右值也可做左值
#include <stdio.h>

void f(int *p);

int main(void)
{
    int i = 6;
    printf("&i=%p\n", &i);
    f(&i);                  //通過&i傳遞i的地址
    printf(" i=%d\n", i);
    return 0;
}

void f(int *p)             //通過 *p 接收 &i
{
    printf(" p=%p\n", p);  //通過 p 訪問 i 的地址
    printf("*p=%d\n", *p); //通過 *p 訪問 i 變量
    *p = 26;               //通過 *p 給 i 變量賦值
}

程序輸出:
&i=0022FE4C
p=0022FE4C
*p=6
i=26

數(shù)組與指針

函數(shù)參數(shù)表中的數(shù)組實際上是指針

#include <stdio.h>
void getMin(int a[], int len, int *min);
int main()
{
    int a[] = {1, 2, 3, 4, 5, 6};
    int min;

    printf("main sizeof(a)=%lu\n", sizeof(a));
    printf("main a=%p\n", a);

    getMin(a, sizeof(a)/sizeof(a[0]), &min);    
    printf("a[0]=%d\n", a[0]);
    printf("min=%d\n", min);

    return 0;
}

void getMin(int a[], int len, int *min)
{
    int i;
    printf("min sizeof(a)=%lu\n", sizeof(a));
    printf("min a=%p\n", a);
    *min = a[0];
    for( i=1; i<len; i++) {
        if( a[i] < *min) {
            *min = a[i];
        }
    }
}

程序輸出:
main sizeof(a)=24
main a=0022FE30
min sizeof(a)=8
min a=0022FE30
a[0]=1
min=1

  • sizeof(a) == sizeof(int*)
  • 在函數(shù)參數(shù)表中 int sum(int a[])int sum(int *a) 是等價的

數(shù)組變量是特殊的指針

數(shù)組變量本身表達地址,所以

  • int a[10]; int* p = a //無需用&取地址

但是數(shù)組的單元表達的是變量,需要用&取地址

  • &a[0]&a[1]、&a[2]

[]運算符可以對數(shù)組做,也可以對指針做:

  • p[0] 等價于 a[0]

*運算符可以對指針做,也可以對數(shù)組做:

  • *a = 25

數(shù)組變量是const的指針,所以不能被賦值

  • int a[] 可以看成是 int * const a

指針的常見錯誤

指針變量在未指向一個變量前不能被賦值

int *p;
*p = 12; // Error
int *p;
int i = 10;
p = &i;  // Right
*p = 12;

const 與 指針

int i;
const int *p1 = &i; //指針所指的不可修改
int const *p2 = &i; //指針所指的不可修改
int *const p3 = &i; //指針不可修改
const int a[] = {1, 2, 3, 4, 5, 6};

數(shù)組變量已經(jīng)是const的指針,這里的const表明數(shù)組的每個單元都是const int,所以只能通過初始化賦值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容