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

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

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

圖解C語言指針變量

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

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

1.2 己值、他址、他空間

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

1.3 聲明與初始化

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

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

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

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

#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()內(nèi)分配一塊堆內(nèi)存,傳遞給主調(diào)函數(shù)。

#include 
#include 
int g(int **iptr) { // 當試圖修改主調(diào)函數(shù)的一級指針變量時,被調(diào)函數(shù)的參數(shù)是一個二級指針
    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表示計算機內(nèi)存,b表示一個函數(shù)調(diào)用時在棧(stack)上開辟的棧幀空間:

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

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

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

#include 


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


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

可以圖示一下以上代碼指針的偏移細節(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ù)組其實只是一個邏輯意義的表示,其物理結構還是一維線性的。

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

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

審核編輯:湯梓紅

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

    關注

    68

    文章

    10873

    瀏覽量

    212081
  • 內(nèi)存
    +關注

    關注

    8

    文章

    3031

    瀏覽量

    74119
  • 操作系統(tǒng)

    關注

    37

    文章

    6840

    瀏覽量

    123404
  • C語言
    +關注

    關注

    180

    文章

    7605

    瀏覽量

    137051
  • 指針變量
    +關注

    關注

    0

    文章

    17

    瀏覽量

    7239

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

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

收藏 人收藏

    評論

    相關推薦

    C語言中指針變量簡述

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

    什么是C語言指針變量

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

    C語言指針電子教程

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

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

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

    10分鐘掌握C語言指針

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

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

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

    單片機C語言指針變量

    單片機C語言變量分別有char型,int型,long型,float型等,它們分別占用內(nèi)存為1個單元,2單元,4單元,4單元等,另外數(shù)組和字符串則占用了內(nèi)存某段連續(xù)的單元。這些變量的共同
    發(fā)表于 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.讀入數(shù)據(jù)總結前言指針對于很多初學C語言的人來說是一個十分復雜比較抽象的知識,今天就帶大家一起來揭開指針的神秘面紗。提示:以
    發(fā)表于 12-09 13:06 ?14次下載
    <b class='flag-5'>指針</b>才是<b class='flag-5'>C</b><b class='flag-5'>語言</b>的精髓

    C語言指針的理解使用

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

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

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

    C語言指針詳細解析

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

    C語言怎樣引用指針變量

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

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

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

    C語言入門之結構體指針

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

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

    指針C語言中一個比較重要的東西,有人說指針C語言的靈魂這句話說的一點也沒錯。 正確靈活地運用
    發(fā)表于 09-21 12:32 ?1111次閱讀
    <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>做函數(shù)參數(shù)