精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

圖解C語(yǔ)言指針變量

STM32嵌入式開(kāi)發(fā) ? 來(lái)源:STM32嵌入式開(kāi)發(fā) ? 2023-05-04 10:15 ? 次閱讀

1 指針變量的基本操作基本操作

    int a,*iptr,*jptr,*kptr;
    iptr = &a;
    jptr = iptr;
    *jptr = 100;
    kptr = NULL;

圖解:

9bbb6900-e83f-11ed-ab56-dac502259ad0.png

1.1 己址和己空間

指針變量也是一個(gè)變量,對(duì)應(yīng)一塊內(nèi)存空間,對(duì)應(yīng)一個(gè)內(nèi)存地址,指針名就是己址。這空內(nèi)存空間多大?一個(gè)機(jī)器字長(zhǎng)(machine word),32位的CPU操作系統(tǒng)就是32個(gè)位,4個(gè)字節(jié),其值域?yàn)椋?x-0xFFFFFFFF。64位的CPU和操作系統(tǒng)就是64個(gè)位,8個(gè)字節(jié),其值域?yàn)椋?x-0xFFFFFFFFFFFFFFFF。

1.2 己值、他址、他空間

指針變量的值就是其指向的空間的地址,指向的地址的空間大小就是指針變量指向類(lèi)型的大小。

1.3 聲明與初始化

當(dāng)聲明一個(gè)指針變量,沒(méi)有初始化時(shí),指針變量只獲得了其自身的內(nèi)存空間,而其指向還沒(méi)有確定,此時(shí)指針變量解引用做左值是非法操作。如果要使用指針變量解引用做左值,有三條途徑:

    int *ptr;
    int *ptr_2;
    int a = 1;
    ptr_2 = &a;
    // *ptr = 0;    // 非法操作,其指向其指向的內(nèi)存空間還未確定
    ptr = &a;                       // ① 右值是一個(gè)變量地址
    ptr = ptr_2;                    // ② 右值是一個(gè)同類(lèi)型指針,且已初始化
    ptr = (int*)malloc(sizeof(int));// ③ 右值是一個(gè)內(nèi)存分配函數(shù)返回一個(gè)void指針
    *ptr = 0;       // 合法操作,ptr有了確定的指向及指向的內(nèi)存空間;

1.4 函數(shù)之間指針值的傳遞

函數(shù)(如下例的funcForSpace())內(nèi)定義局部變量(如下例的a)保存在一個(gè)函數(shù)的棧幀上,當(dāng)一個(gè)函數(shù)執(zhí)行完畢后,另一個(gè)函數(shù)(如下例的stackFrame_reuse())執(zhí)行時(shí),該空間會(huì)被stackFrame_reuse()重復(fù)使用,a所使用的空間將不復(fù)存在,所以當(dāng)一個(gè)指針變量指向局部變量的內(nèi)存空間時(shí),其地址值傳遞給主調(diào)函數(shù)時(shí),并不是一個(gè)有效值。

#include 


void funcForSpace(int **iptr) {
    int a = 10;
    *iptr = &a;
}
void stackFrame_reuse()
{
    int a[1024] = {0};
}
int main()
{
    int *pNew;
    funcForSpace(&pNew);
    printf("%d
",*pNew); // 10,此時(shí)棧幀還未被重復(fù)使用
    stackFrame_reuse();
    printf("%d
",*pNew); // -858993460,垃圾值
    while(1);
    return 0;
}

可以在funcForSpace()內(nèi)分配一塊堆內(nèi)存,傳遞給主調(diào)函數(shù)。

#include 
#include 
int g(int **iptr) { // 當(dāng)試圖修改主調(diào)函數(shù)的一級(jí)指針變量時(shí),被調(diào)函數(shù)的參數(shù)是一個(gè)二級(jí)指針
    if ((*iptr = (int *)malloc(sizeof(int))) == NULL)
        return -1;
}
int main()
{
    int *jptr;
    g(&jptr);
    *jptr = 10;
    printf("%d
",*jptr); // 10
    free(jptr);
    while(1);
    return 0;
}

可以圖示一下以上代碼指針的傳遞過(guò)程:

9bc28442-e83f-11ed-ab56-dac502259ad0.png

以下圖示a表示計(jì)算機(jī)內(nèi)存,b表示一個(gè)函數(shù)調(diào)用時(shí)在棧(stack)上開(kāi)辟的棧幀空間:

9bd13bae-e83f-11ed-ab56-dac502259ad0.png

2 指針變量與數(shù)組名

數(shù)組名在一定的上下文中會(huì)轉(zhuǎn)換為指向數(shù)組首元素的地址,以方便指針的算術(shù)運(yùn)算,如

#include 


int main()
{
    int a[5] = {0}; 
    char b[20] = {0};
    *(a+3) = 10;    // a+3是指相對(duì)于地址a,偏移sizeof(int)個(gè)字節(jié)
    *(b+3) = 'x';   // b+3是指相對(duì)于地址b,偏移sizeof(char)個(gè)字節(jié)


    printf("%d, %c
",a[3],b[3]); // 10, x
    while(1);
    return 0;
}

可以圖示一下以上代碼指針的偏移細(xì)節(jié):

9bd87c0c-e83f-11ed-ab56-dac502259ad0.png

3 主調(diào)函數(shù)與被調(diào)函數(shù)之間的指針傳遞

看以下代碼:

#include 
void swap1(int x, int y) {
    int tmp;
    tmp = x; x = y; y = tmp;
}
void swap2(int *x, int *y) {
    int tmp;
    tmp = *x; *x = *y; *y = tmp;
}
void caller()
{
    int a = 10;
    int b = 20;
    swap1(a,b);
    printf("%d %d
",a,b);
    swap2(&a,&b);
    printf("%d %d
",a,b);
}
int main()
{
    caller();
    return 0;
}

以上代碼可用以下圖示理解:

swap1傳值:

9beec2aa-e83f-11ed-ab56-dac502259ad0.png

swap2傳址(指針傳遞):

9bf643b8-e83f-11ed-ab56-dac502259ad0.png

4 數(shù)組做函數(shù)參數(shù)

二維數(shù)組是數(shù)組的數(shù)組,n維數(shù)組是n-1維數(shù)組的數(shù)組。內(nèi)存是一維的字節(jié)序列,所謂的n維數(shù)組其實(shí)只是一個(gè)邏輯意義的表示,其物理結(jié)構(gòu)還是一維線性的。

n維數(shù)組的元素是一個(gè)n-1維數(shù)組。如果用指針指向一個(gè)n維數(shù)組,其指針類(lèi)型必須有n-1維的長(zhǎng)度信息,當(dāng)其用作函數(shù)參數(shù)時(shí)也是如此。

void g(int a[][2]) { // void g(int(*a)[2]){是相同寫(xiě)法
    a[2][0] = 5;
}
void caller()
{
    int a[3][2];
    int (*p)[2] = a;
    *(*(p+2)+0) = 7; // p=2表示相對(duì)于地址p偏移sizeof(*p)
    printf("%d
",a[2][0]);  // 7
    g(a);
    printf("%d
",a[2][0]); //  5
}

以下代碼可以用以下圖示輔助理解:

9c0543d6-e83f-11ed-ab56-dac502259ad0.png

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10829

    瀏覽量

    211196
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    3004

    瀏覽量

    73900
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6747

    瀏覽量

    123204
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7601

    瀏覽量

    136251
  • 指針變量
    +關(guān)注

    關(guān)注

    0

    文章

    17

    瀏覽量

    7229

原文標(biāo)題:圖解C語(yǔ)言指針變量

文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言中指針變量簡(jiǎn)述

    指針變量,那必然會(huì)有變量類(lèi)型,因此這里必須對(duì)變量類(lèi)型做解釋。在C語(yǔ)言中,所有的
    的頭像 發(fā)表于 09-09 08:55 ?2163次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中指針</b><b class='flag-5'>變量</b>簡(jiǎn)述

    什么是C語(yǔ)言指針變量

    C語(yǔ)言指針變量
    發(fā)表于 12-15 07:22

    C語(yǔ)言指針電子教程

    本資料是一份不錯(cuò)的關(guān)于C語(yǔ)言指針的電子教程,希望對(duì)大家有所幫助... 指針簡(jiǎn)介 指針C
    發(fā)表于 07-30 16:00 ?77次下載

    C語(yǔ)言指針指針變量的簡(jiǎn)介和運(yùn)算實(shí)例程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C語(yǔ)言指針指針變量的簡(jiǎn)介和運(yùn)算實(shí)例程序免費(fèi)下載
    發(fā)表于 11-05 17:38 ?14次下載

    10分鐘掌握C語(yǔ)言指針

    說(shuō)到指針,估計(jì)還是有很多小伙伴都還是云里霧里的,有點(diǎn)知其然,而不知其所以然。但是,不得不說(shuō),學(xué)了指針C語(yǔ)言才能算是入門(mén)了。指針
    的頭像 發(fā)表于 11-04 16:37 ?1720次閱讀

    C語(yǔ)言中的野指針是怎么來(lái)的?

    一、什么是野指針指針C語(yǔ)言的靈魂,同時(shí)也是很容易讓人犯錯(cuò)的重難點(diǎn),用錯(cuò)了指針將是一個(gè)災(zāi)難。 指針
    的頭像 發(fā)表于 06-01 16:43 ?2530次閱讀

    單片機(jī)C語(yǔ)言指針變量

    單片機(jī)C語(yǔ)言變量分別有char型,int型,long型,float型等,它們分別占用內(nèi)存為1個(gè)單元,2單元,4單元,4單元等,另外數(shù)組和字符串則占用了內(nèi)存某段連續(xù)的單元。這些變量的共同
    發(fā)表于 11-21 09:06 ?15次下載
    單片機(jī)<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>之<b class='flag-5'>指針</b><b class='flag-5'>變量</b>

    指針才是C語(yǔ)言的精髓

    文章目錄前言一、pandas是什么?二、使用步驟1.引入庫(kù)2.讀入數(shù)據(jù)總結(jié)前言指針對(duì)于很多初學(xué)C語(yǔ)言的人來(lái)說(shuō)是一個(gè)十分復(fù)雜比較抽象的知識(shí),今天就帶大家一起來(lái)揭開(kāi)指針的神秘面紗。提示:以
    發(fā)表于 12-09 13:06 ?14次下載
    <b class='flag-5'>指針</b>才是<b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>的精髓

    C語(yǔ)言指針的理解使用

    C語(yǔ)言指針的理解使用指針變量的聲明給普通變量的賦值對(duì)比給指針
    發(fā)表于 01-13 13:42 ?3次下載
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>指針</b>的理解使用

    c語(yǔ)言指針用法簡(jiǎn)單舉例 C51的指針概述

    指針C語(yǔ)言的一個(gè)特殊的變量,它存儲(chǔ)的數(shù)值被解釋成為內(nèi)存的一個(gè)地址。 指針定義的一般形式如下。 數(shù)據(jù)類(lèi)型 *
    的頭像 發(fā)表于 04-22 18:04 ?4730次閱讀

    C語(yǔ)言指針詳細(xì)解析

    可以對(duì)數(shù)據(jù)本身,也可以對(duì)存儲(chǔ)數(shù)據(jù)的變量地址進(jìn)行操作。 指針是一個(gè)占據(jù)存儲(chǔ)空間的實(shí)體在這一段空間起始位置的相對(duì)距離值。在C/C++語(yǔ)言中,
    的頭像 發(fā)表于 11-14 16:53 ?2184次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>指針</b>詳細(xì)解析

    C語(yǔ)言怎樣引用指針變量

    指針C語(yǔ)言中的一個(gè)重要概念,也是C語(yǔ)言的一個(gè)重要特色。正確而靈活地運(yùn)用它,可以使程序簡(jiǎn)潔、緊湊、高校。 由于通過(guò)地址能找到所需的
    的頭像 發(fā)表于 03-10 14:43 ?1007次閱讀

    C語(yǔ)言中什么是指針數(shù)組

    C語(yǔ)言中一個(gè)數(shù)組,若其元素均為指針類(lèi)型數(shù)據(jù),稱(chēng)為指針數(shù)組,也就是說(shuō),指針數(shù)組中的每一個(gè)元素都存放一個(gè)地址,相當(dāng)于一個(gè)
    的頭像 發(fā)表于 03-10 15:26 ?1678次閱讀

    C語(yǔ)言入門(mén)之結(jié)構(gòu)體指針

    C語(yǔ)言中,指向結(jié)構(gòu)體對(duì)象的指針變量既可以指向結(jié)構(gòu)體變量,也可指向結(jié)構(gòu)體數(shù)組中的元素。 指針
    的頭像 發(fā)表于 03-24 14:59 ?1001次閱讀

    c語(yǔ)言指針用法詳解:如何使用指針變量做函數(shù)參數(shù)

    指針C語(yǔ)言中一個(gè)比較重要的東西,有人說(shuō)指針C語(yǔ)言的靈魂這句話說(shuō)的一點(diǎn)也沒(méi)錯(cuò)。 正確靈活地運(yùn)用
    發(fā)表于 09-21 12:32 ?1046次閱讀
    <b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b><b class='flag-5'>指針</b>用法詳解:如何使用<b class='flag-5'>指針</b><b class='flag-5'>變量</b>做函數(shù)參數(shù)