在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

圖解C語言指針變量

STM32嵌入式開發 ? 來源:STM32嵌入式開發 ? 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 己址和己空間

指針變量也是一個變量,對應一塊內存空間,對應一個內存地址,指針名就是己址。這空內存空間多大?一個機器字長(machine word),32位的CPU操作系統就是32個位,4個字節,其值域為:0x-0xFFFFFFFF。64位的CPU和操作系統就是64個位,8個字節,其值域為:0x-0xFFFFFFFFFFFFFFFF。

1.2 己值、他址、他空間

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

1.3 聲明與初始化

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

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

1.4 函數之間指針值的傳遞

函數(如下例的funcForSpace())內定義局部變量(如下例的a)保存在一個函數的棧幀上,當一個函數執行完畢后,另一個函數(如下例的stackFrame_reuse())執行時,該空間會被stackFrame_reuse()重復使用,a所使用的空間將不復存在,所以當一個指針變量指向局部變量的內存空間時,其地址值傳遞給主調函數時,并不是一個有效值。

#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,此時棧幀還未被重復使用
    stackFrame_reuse();
    printf("%d
",*pNew); // -858993460,垃圾值
    while(1);
    return 0;
}

可以在funcForSpace()內分配一塊堆內存,傳遞給主調函數。

#include 
#include 
int g(int **iptr) { // 當試圖修改主調函數的一級指針變量時,被調函數的參數是一個二級指針
    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;
}

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

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

以下圖示a表示計算機內存,b表示一個函數調用時在棧(stack)上開辟的棧幀空間:

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

2 指針變量與數組名

數組名在一定的上下文中會轉換為指向數組首元素的地址,以方便指針的算術運算,如

#include 


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


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

可以圖示一下以上代碼指針的偏移細節:

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

3 主調函數與被調函數之間的指針傳遞

看以下代碼:

#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 數組做函數參數

二維數組是數組的數組,n維數組是n-1維數組的數組。內存是一維的字節序列,所謂的n維數組其實只是一個邏輯意義的表示,其物理結構還是一維線性的。

n維數組的元素是一個n-1維數組。如果用指針指向一個n維數組,其指針類型必須有n-1維的長度信息,當其用作函數參數時也是如此。

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

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

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

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • cpu
    cpu
    +關注

    關注

    68

    文章

    10905

    瀏覽量

    213030
  • 內存
    +關注

    關注

    8

    文章

    3055

    瀏覽量

    74336
  • 操作系統
    +關注

    關注

    37

    文章

    6896

    瀏覽量

    123753
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137730
  • 指針變量
    +關注

    關注

    0

    文章

    17

    瀏覽量

    7244

原文標題:圖解C語言指針變量

文章出處:【微信號:c-stm32,微信公眾號:STM32嵌入式開發】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言中指針變量簡述

    指針變量,那必然會有變量類型,因此這里必須對變量類型做解釋。在C語言中,所有的
    的頭像 發表于 09-09 08:55 ?2262次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言中指針</b><b class='flag-5'>變量</b>簡述

    什么是C語言指針變量

    C語言指針變量
    發表于 12-15 07:22

    C語言指針電子教程

    本資料是一份不錯的關于C語言指針的電子教程,希望對大家有所幫助... 指針簡介 指針C
    發表于 07-30 16:00 ?77次下載

    C語言指針指針變量的簡介和運算實例程序免費下載

    本文檔的主要內容詳細介紹的是C語言指針指針變量的簡介和運算實例程序免費下載
    發表于 11-05 17:38 ?14次下載

    10分鐘掌握C語言指針

    說到指針,估計還是有很多小伙伴都還是云里霧里的,有點知其然,而不知其所以然。但是,不得不說,學了指針C語言才能算是入門了。指針
    的頭像 發表于 11-04 16:37 ?1781次閱讀

    C語言中的野指針是怎么來的?

    一、什么是野指針指針C語言的靈魂,同時也是很容易讓人犯錯的重難點,用錯了指針將是一個災難。 指針
    的頭像 發表于 06-01 16:43 ?2598次閱讀

    單片機C語言指針變量

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

    指針才是C語言的精髓

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

    C語言指針的理解使用

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

    c語言指針用法簡單舉例 C51的指針概述

    指針C語言的一個特殊的變量,它存儲的數值被解釋成為內存的一個地址。 指針定義的一般形式如下。 數據類型 *
    的頭像 發表于 04-22 18:04 ?4921次閱讀

    C語言指針詳細解析

    可以對數據本身,也可以對存儲數據的變量地址進行操作。 指針是一個占據存儲空間的實體在這一段空間起始位置的相對距離值。在C/C++語言中,
    的頭像 發表于 11-14 16:53 ?2258次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>指針</b>詳細解析

    C語言怎樣引用指針變量

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

    C語言中什么是指針數組

    C語言中一個數組,若其元素均為指針類型數據,稱為指針數組,也就是說,指針數組中的每一個元素都存放一個地址,相當于一個
    的頭像 發表于 03-10 15:26 ?1874次閱讀

    C語言入門之結構體指針

    C語言中,指向結構體對象的指針變量既可以指向結構體變量,也可指向結構體數組中的元素。 指針
    的頭像 發表于 03-24 14:59 ?1110次閱讀

    c語言指針用法詳解:如何使用指針變量做函數參數

    指針C語言中一個比較重要的東西,有人說指針C語言的靈魂這句話說的一點也沒錯。 正確靈活地運用
    發表于 09-21 12:32 ?1157次閱讀
    <b class='flag-5'>c</b><b class='flag-5'>語言</b><b class='flag-5'>指針</b>用法詳解:如何使用<b class='flag-5'>指針</b><b class='flag-5'>變量</b>做函數參數
    主站蜘蛛池模板: 激情文学亚洲色图 | 色婷婷国产 | 欧美色图色就是色 | 日韩高清毛片 | 免费网站看av片 | 色偷偷亚洲综合网亚洲 | 日本网站黄色 | 四虎永久在线精品网址 | 簧片免费视频 | 亚洲成人免费在线观看 | 97色爱| 男人j桶进女人免费视频 | 欧美高清xx | 欧美精品1| 狠狠干天天爱 | 高清一区二区在线观看 | 午夜精品福利影院 | 欧美一级欧美三级在线观看 | 国产婷婷一区二区三区 | 日本不卡在线观看免费v | 国模欢欢大尺度 | 黄网站视频在线观看 | 久久综合九色综合精品 | 日本特黄a级高清免费大片18 | 国产成人a | 性感美女福利视频 | 色老头一区二区三区在线观看 | 欧美特级黄 | 热久久久久久 | 日韩一区二区三区免费 | 国模无水印一区二区三区 | 久久婷婷是五月综合色狠狠 | 国产黄大片在线观看 | 四虎影院最新 | 深夜释放自己vlog糖心旧版本 | 成人综合激情 | 在线免费日韩 | 99热最新在线 | 91av视频免费在线观看 | 六月婷婷导航福利在线 | 天天干夜夜谢 |