最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言由淺入深理解指針

 更新時(shí)間:2022年05月09日 11:59:19   作者:龜π氣功  
C語(yǔ)言這門課程在計(jì)算機(jī)的基礎(chǔ)教學(xué)中一直占有比較重要的地位,然而要想突破C語(yǔ)言的學(xué)習(xí),對(duì)指針的掌握是非常重要的,本文將具體針對(duì)指針的基礎(chǔ)做詳盡的介紹

1. 相關(guān)概念

  • 操作系統(tǒng)給每個(gè)存儲(chǔ)單元分配了一個(gè)編號(hào),從ox00 00 00 00~0xff ff ff ff,這個(gè)編號(hào)稱為地址,指針就是地址
  • 指針變量:即這個(gè)變量用來(lái)存放一個(gè)地址編號(hào)
  • 無(wú)論什么類型的地址,都是存儲(chǔ)單元的變換,在32位平臺(tái)下都是4個(gè)字節(jié),即任何類型的指針變量都是4個(gè)字節(jié)大小,64位操作系統(tǒng)占8個(gè)字節(jié)。
  • 對(duì)應(yīng)類型的指針變量,只能存放對(duì)應(yīng)類型的地址。例如整型指針變量,只能存放整型變量的地址。
#include <stdio.h>
int main()
{
    char *a;
    short *b;
    int *c;
    long *d;
    float *e;
    double *f;
    printf("sizeof(a)=%d\n", sizeof(a));
    printf("sizeof(b)=%d\n", sizeof(b));
    printf("sizeof(c)=%d\n", sizeof(c));
    printf("sizeof(d)=%d\n", sizeof(d));
    printf("sizeof(e)=%d\n", sizeof(e));
    printf("sizeof(f)=%d\n", sizeof(f));
    return 0;
}

可見,我的操作系統(tǒng)是64位的。

為什么在64位系統(tǒng)中指針的大小是8,而32位的卻是4? 

64位系統(tǒng),這個(gè)位數(shù)指的是CPU 里面的通用寄存器的數(shù)據(jù)寬度為64位,也就是說(shuō)一個(gè)地址占二進(jìn)制位數(shù)是64,所以:

sizeof(double *)==sizeof(int *)==sizeof(char *)==64/8==8

32位系統(tǒng),同理,他的一個(gè)地址占32位二進(jìn)制空間,sizeof(double *)==sizeof(int *)==sizeof(char *)==32/8==4

其實(shí)明白了兩個(gè)系統(tǒng)的尋址原理就能明白,大體就是這個(gè)原因。地址跟系統(tǒng)有關(guān),但是基本數(shù)據(jù)類型占的大小是由C語(yǔ)言本身決定。

2. 指針的定義方法

數(shù)據(jù)類型 *指針變量名

int p; // 定義了一個(gè)指針變量p 在定義指針變量的時(shí)候, 是用來(lái)修飾變量的,代表指針變量。

關(guān)于指針的運(yùn)算符:

& 取地址 * 取值

#include <stdio.h>
int main()
{
    int a = 100;
    int *p; // 定義一個(gè)指針變量
    p = &a; // 給指針變量賦值
    printf("a = %d, %d\n", a, *p);  // *p 等價(jià)于變量 a
    return 0;
}

拓展:如果一行中定義多個(gè)指針變量,每個(gè)變量前面都要加*修飾

3. 指針的分類

  1. 字符指針
  2. 短整型指針
  3. 整型指針
  4. 長(zhǎng)整型指針
  5. float型指針
  6. double型指針
  7. 函數(shù)指針
  8. 結(jié)構(gòu)體指針
  9. 指針的指針
  10. 數(shù)組的指針

4. 指針和變量的關(guān)系

引用變量的方法:

1.直接通過(guò)變量的名稱

2.通過(guò)*指針名稱 引用

#include <stdio.h>
int main()
{
    int *p1, *p2, temp, a, b;
    p1 = &a;
    p2 = &b;
    printf("請(qǐng)輸入a,b的值:\n");
    scanf("%d %d", p1, p2); // 和之前的scanf不同,這里直接用p1p2作為寫入地址。
    temp = *p1;  // 用p1指向的變量a給temp賦值
    *p1 = *p2; // 用p2指向的變量b給p1指向的變量a賦值
    *p2 = temp;  // temp給p2指向的變量b賦值
    printf("a=%d b=%d\n", a, b);
    printf("*p1=%d,*p2=%d\n", *p1, *p2);
    return 0;
}

如果想讓不同類型的指針相互賦值的時(shí)候,需要強(qiáng)制類型轉(zhuǎn)換:

#include <stdio.h>
int main()
{
    int a = 0x1234, b = 0x5678;  // 4個(gè)字節(jié)
    char *p1, *p2;  // char類型只能保存一個(gè)字節(jié)
    printf("%#x  %#x\n", a, b);
    p1 = (char *)&a;  // 強(qiáng)制類型轉(zhuǎn)換
    p2 = (char *)&b;
    printf("%#x  %#x\n", *p1, *p2);
    p1++;  // 指針向上移動(dòng)
    p2++;
    printf("%#x  %#x\n", *p1, *p2);
    return 0;
}

5. 指針與數(shù)組的關(guān)系

指針保存的是數(shù)組第一個(gè)元素的地址

也可以通過(guò)*(p+2)=100給當(dāng)前地址的下一個(gè)變量賦值

#include<stdio.h>
int main(){
    int a[5] = {0,1,2,3,4};
    int *p;
    p = a;
    // 指針指向數(shù)組a的第一個(gè)元素的首地址
    printf("a[2]=%d\n",a[2]);
    printf("p[2]=%d\n",p[2]);
    // *(a+n) <==> *(p+n) <==> a[n] <==> p[n]
    printf("*(p+2)%d\n",*(p+2));
    printf("*(a+2)%d\n",*(a+2));
    printf("p=%p\n",p);
    printf("p+2=%p\n",p+2);
    return 0;
}

6. 指針的運(yùn)算

指針可以加一個(gè)整數(shù),往下指幾個(gè)它指向的變量,結(jié)果還是地址

#include <stdio.h>
void test1()
{
    int a[10];
    int *p, *q;
    p = a;
    q = p + 2;  // p q 間隔8個(gè)字節(jié),意味著加一個(gè)整數(shù)最終移動(dòng)的字節(jié)數(shù)與指針變量的類型也有關(guān)系
    printf("p=%p\n", p);
    printf("q=%p\n", q);
    return;
}
int main()
{
    test1();
    return 0;
}

  • 兩個(gè)相同的指針可以比較大小

前提:指向同一個(gè)數(shù)組的元素

#include <stdio.h>
void test2()
{
    int a[10];
    int *p, *q;
    p = &a[1];
    q = &a[6];
    if (p < q)
    {
        printf("p < q\n");
    }
    else if (p > q)
    {
        printf("p > q\n");
    }
    else
    {
        printf("p = q\n");
    }
    return;
}
int main()
{
    //  test1();
    test2();
    return 0;
}

  • 兩個(gè)同類型的指針可以做減法

前提:指向同一個(gè)數(shù)組元素,減法的結(jié)果是指針指向的中間有多少個(gè)元素

#include <stdio.h>
void test3()
{
    int a[10];
    int *p, *q;
    p = &a[0];
    q = &a[3];
    printf("%ld\n", q - p);
    return ;
}
int main()
{
    //  test1();
    //  test2();
    test3();
    return 0;
}

  • 兩個(gè)相同類型的指針可以相互賦值
#include <stdio.h>
void test4()
{
    int a = 100;
    int *p, *q;
    p = &a;
    printf("a=%d %d\n", a, *p);
    q = p;
    printf("*q=%d\n", *q);
    *q = 999;
    printf("a=%d\n", a);
}
int main()
{
    //  test1();
    //  test2();
    //  test3();
    test4();
    return 0;
}

到此這篇關(guān)于C語(yǔ)言由淺入深理解指針的文章就介紹到這了,更多相關(guān)C語(yǔ)言指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言之實(shí)現(xiàn)棧的基礎(chǔ)創(chuàng)建

    C語(yǔ)言之實(shí)現(xiàn)棧的基礎(chǔ)創(chuàng)建

    這篇文章主要介紹了C語(yǔ)言之實(shí)現(xiàn)棧的基礎(chǔ)創(chuàng)建,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C語(yǔ)言如何利用異或進(jìn)行兩個(gè)值的交換詳解

    C語(yǔ)言如何利用異或進(jìn)行兩個(gè)值的交換詳解

    最近在工作中遇到了兩個(gè)值交換的需求,發(fā)現(xiàn)自己對(duì)異或有些忘記,所以索性寫出來(lái),方便以后需要的時(shí)候參考學(xué)習(xí),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言如何利用異或進(jìn)行兩個(gè)值的交換的相關(guān)資料,需要的朋友可以參考下。
    2017-09-09
  • C++深入講解new與deleted關(guān)鍵字的使用

    C++深入講解new與deleted關(guān)鍵字的使用

    這篇文章主要介紹了C++中new與deleted關(guān)鍵字的使用,new在動(dòng)態(tài)內(nèi)存中為對(duì)象分配空間并返回一個(gè)指向該對(duì)象的指針;delete接受一個(gè)動(dòng)態(tài)對(duì)象的指針, 銷毀該對(duì)象, 并釋放與之關(guān)聯(lián)的內(nèi)存
    2022-05-05
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單航班管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單航班管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單航班管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C++關(guān)于const與引用的分析講解

    C++關(guān)于const與引用的分析講解

    Const?是C++中常用的類型修飾符,常類型是指使用類型修飾符const說(shuō)明的類型,常類型的變量或?qū)ο蟮闹凳遣荒鼙桓碌模米兞渴且粋€(gè)別名,也就是說(shuō),它是某個(gè)已存在變量的另一個(gè)名字。一旦把引用初始化為某個(gè)變量,就可以使用該引用名稱或變量名稱來(lái)指向變量
    2022-04-04
  • C++如何用數(shù)組模擬鏈表

    C++如何用數(shù)組模擬鏈表

    大家好,本篇文章主要講的是C++如何用數(shù)組模擬鏈表,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C++實(shí)現(xiàn)學(xué)生住宿管理系統(tǒng)

    C++實(shí)現(xiàn)學(xué)生住宿管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)學(xué)生住宿管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言 哈希查找詳解(哈希表的創(chuàng)建、處理沖突、查找等)

    C語(yǔ)言 哈希查找詳解(哈希表的創(chuàng)建、處理沖突、查找等)

    哈希表是一種非常重要的數(shù)據(jù)結(jié)構(gòu),并在大量的計(jì)算機(jī)科學(xué)和工程應(yīng)用中發(fā)揮重要作用,了解哈希表的原理和實(shí)現(xiàn)方式,將有助于我們更好地理解這個(gè)數(shù)據(jù)結(jié)構(gòu)及如何應(yīng)用它來(lái)解決實(shí)際問(wèn)題,這篇文章主要介紹了C語(yǔ)言 哈希查找(哈希表的創(chuàng)建、處理沖突、查找等),需要的朋友可以參考下
    2024-01-01
  • C++智能指針shared_ptr分析

    C++智能指針shared_ptr分析

    這篇文章主要介紹了C++智能指針shared_ptr分析的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • C語(yǔ)言中不定參數(shù)?...?的語(yǔ)法以及函數(shù)封裝

    C語(yǔ)言中不定參數(shù)?...?的語(yǔ)法以及函數(shù)封裝

    不定參數(shù)是指函數(shù)可以接收不確定個(gè)數(shù)的參數(shù),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中不定參數(shù)?...?的語(yǔ)法以及函數(shù)封裝的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01

最新評(píng)論

华蓥市| 永新县| 乐昌市| 会理县| 阿克陶县| 承德县| 宣化县| 正蓝旗| 化隆| 运城市| 玛纳斯县| 凤城市| 塔城市| 西畴县| 资溪县| 台安县| 宁强县| 洱源县| 郎溪县| 徐水县| 遵义市| 依兰县| 富民县| 乐山市| 临猗县| 应城市| 吉林省| 彭州市| 高平市| 邵阳市| 建德市| 忻城县| 诸暨市| 祁阳县| 都江堰市| 内丘县| 东莞市| 鸡西市| 岳阳市| 百色市| 台江县|