色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

教你如何輕松寫單片機的指針

凡億PCB ? 來源:果果小師弟 ? 作者:果果小師弟 ? 2021-06-17 16:08 ? 次閱讀

摘要:大家想過沒有我們用keil單片機的代碼,你的函數啊、變量啊最終都放在了哪里?我們一直說的內存五區,到底是哪五區?到底放在芯片的哪個地方呢?還有為什么你學完C語言指針和結構體,32單片機里面的關于結構體指針的內容還是搞不清楚呢?如果你有這些問題,今天就帶你研究研究!

這張圖學過STM32單片機的小伙伴應該都不陌生,我們看到的STM32芯片已經是已經封裝好的成品,主要由內核和片上外設組成。若與電腦類比,內核與外設就如同電腦上的CPU與主板、內存、顯卡、硬盤的關系。芯片和外設之間通過各種總線連接。連接被控總線的是FLASH,RAM和片上外設,這些功能部件共同排列在一個4GB的地址空間內。上面這些張圖是STM32F40XXX系列單片機的內存地址映射圖。

我們的代碼就是放在Flash里面(0x8000000~0x80FFFFF)。代碼就是你寫得各種函數,而在程序中聲明的各種變量都放在RAM中,局部變量就是在函數運行完空間釋放,全局變量就是程序運行完了再釋放,可以這樣簡單的理解。

CPU使用的變量是存儲在RAM里面的,要問我RAM是啥,RAM就是個芯片。就是上圖的Block1的SRAM區。CPU是通過導線和RAM芯片連接的,然后可以通過導線往RAM芯片里面存儲數據和讀數據。首先RAM需要有個一開始的地址,對于STM32單片機來說開始地址是0x20000000,要問我為啥要規定地址。只有規定了地址CPU才好對數據進行存儲,要是沒有地址,瞎幾把存,瞎幾把取。。.。。.

1、變量1.定義一個int型的變量,通過打印可以看到這個變量存儲的地址是:0x20000000。這也證明了我們內存的首地址是0x20000000。我們定義的value變量就放在這里。

3aea0c10-ca98-11eb-9e57-12bb97331649.png

3b100280-ca98-11eb-9e57-12bb97331649.png

2.再定義一個變量

通過打印可以看到這個變量存儲的地址是:0x20000004。因為int類型在內存中占據4個字節,所以第二個變量就存放在0x20000004這個地方。

3b1f7e2c-ca98-11eb-9e57-12bb97331649.png

綜上所述,定義的兩個變量在內存里面是下面這樣子。

0x2000 0000地址里面存儲的是 0

0x2000 0004地址里面存儲的是 1

2、指針變量定義指針其實和定義變量一樣的,只不過變量名前頭有個*

下面就定義一個int型的指針變量,變量的名字是p。然后有人會問,為啥變量名字前面加個*就是指針了?

答:搞C語言那幫家伙們規定的。

定義指針和定義變量一樣,然后可以定義各種類型的。

然后記住一句話:

“指針這個變量是存變量的地址的! 指針這個變量是存變量的地址的! 指針這個變量是存變量的地址的!”所以給指針賦值自然是把變量的地址給它。

#include “sys.h”#include “led.h”#include “delay.h”#include “usart.h”int value = 0;

int value2 = 1;

int *p;

int main(void)

{

uart_init(115200);

delay_init();

p=&value;//把變量value的地址復制給這個指針

printf(“Address of a: %p

”,p);//打印下這個指針指向的地址

while(1)

{

}

}

一般什么類型的指針變量就應該賦值什么類型變量的地址。如再定義個char型

#include “sys.h”#include “led.h”#include “delay.h”#include “usart.h”int value = 0;

int value2 = 1;

int *p;//定義一個指針char value3=1;

char *q;

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

p=&value;//把變量value的地址復制給這個指針

q=&value3;//把變量value的地址復制給這個指針

printf(“Address of a: %p

”,q);//打印下這個指針指向的地址

while(1)

{

}

}

那些規定C語言的大佬弄出來指針這個玩意有啥用?

3、指針有啥用?1.咱先使用下指針,然后具體有啥用就自己體會了。前面咱把一個變量的地址賦值給了指針了,然后搞C語言的那幫家伙們又規定。*{指針變量名} :代表了這個指針所指向的變量。

啥意思呢?

對照下面的程序p=&value,p記錄的就是變量value的地址, 然后*p就代表value。

#include “sys.h”#include “led.h”#include “delay.h”#include “usart.h”int value = 0;

int *p;//定義一個指針

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

p=&value;//把變量value的地址復制給指針變量p

printf(“Address of a: %d

”,value);

printf(“Address of b: %d

”,*p);

while(1)

{

}

}

3bdfdb54-ca98-11eb-9e57-12bb97331649.png

有人會想。。.。。.就這?

有人覺得多此一舉?

其實我一開始也是這樣想的。。.。。.

既然 * p就代表value,那么* p=XXXX

不就是相當于value=XXXX

看看下面這個例子

#include “sys.h”#include “led.h”#include “delay.h”#include “usart.h”int value = 0;

int *p;//定義一個指針 int main(void)

{

uart_init(115200);//串口初始化

delay_init();

p=&value;//把變量value的地址復制給指針變量p

printf(“value of a: %d

”,value);

*p=520;

printf(“value of b: %d

”,value);

while(1)

{

}

}

還是沒感覺到指針有啥用?別著急,先把基本的知識點學完哈。沒有最基本的知識儲備是不可以的,因為厚積而薄發!

見過返回值是指針的函數沒?

4、函數指針先看一下,如果感覺不理解就接著往下看

#include “sys.h”#include “led.h”#include “delay.h”#include “usart.h”int value = 0;

int *p;//定義一個指針

int *function(void)

{

return &value;//把value的地址返回

}

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

p=function();//調用函數,其實就是把value的地址賦值給了p

printf(“Address1 of a: %p

”,&value);//打印value的地址

printf(“Address2 of a: %p

”,p);//打印p所代表的地址

while(1)

{

}

}

很多人用過返回值是int、char的函數,但是在int,char 后面加個*

估計對于初學者沒有用過。其實就是指針之間賦值。下面就是把p(int*類型的指針) 代表的地址賦值給q

變量之間可以互相賦值吧,指針之間也一樣,可以互相之間賦值。

其實和上面是一樣的道理,那個函數function返回值是一個int*類型的指針,然后賦值給了p而已

#include “sys.h”#include “led.h”#include “delay.h”#include “usart.h”int value = 0;

int *p;//定義一個指針int *q;//定義一個指針

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

p=&value;//把value的地址賦值給了p

q=p;//把p代表的地址給q

printf(“Address1 of a: %p

”,&value);//打印value的地址

printf(“Address2 of a: %p

”,q);//打印p所代表的地址

while(1)

{

}

}

姑且再問一句,函數名字是啥?

咱們都知道這樣調用函數

#include “sys.h”#include “led.h”#include “delay.h”#include “usart.h”void function()

{

printf(“zhiguoxin

”);

}

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

function();

while(1)

{

}

}

但是這樣的見過沒

#include “sys.h”#include “led.h”#include “delay.h”#include “usart.h”void (*fun)();

void function()

{

printf(“zhiguoxin

”);

}

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

fun = function;

fun();

while(1)

{

}

}

這里采用了函數指針

先記住一句話

“函數名就是這個函數的地址! 函數名就是這個函數的地址! 函數名就是這個函數的地址!”既然是地址,那么這個地址應該可以賦值給一個指針。因為是函數的地址,所以咱定義的指針也一定是一個函數類型的。

上面的函數void function()是一個沒有返回值,沒有形參的函數。那么咱需要定義一個這種的指針類型,其實就是void (*指針變量名字,隨意寫) ()。上面寫的是 void (*fun)(); fun就是一個函數類型的指針,是一個沒有返回值,沒有形參的函數指針。

咱可以把這種函數賦值給這個指針變量。就是上面的fun=function。那么這個函數指針便代表了那個函數fun就等同于function。所以調用 fun(); 就等同于調用function()。

如果函數有形參怎么辦? 好辦,它有咱就+

#include “sys.h”#include “led.h”#include “delay.h”#include “usart.h”void (*fun)(int a);

void function(int value)

{

printf(“value= %d

”,value);

}

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

fun = function;//把function賦值給fun

fun(520);//fun就等同于function

while(1)

{

}

}

如果函數有返回值怎么辦?照+不誤

#include “sys.h”#include “led.h”#include “delay.h”#include “usart.h”int res;

int (*fun)(int a);

int function(int value)

{

return value;

}

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

fun = function;//把function賦值給fun

res = fun(520);//fun就等同于function

printf(“res = %d”,res);

while(1)

{

}

}

總結一下

指針呢其實基本的也就是上面那些,指針就是用來記錄變量的地址的。或是做地址之間的傳遞的。

&代表取地址符。

*代表取數據。

&{變量名} :就是把這個變量的地址取出來。

*{指針變量名} :就是把這個指針所代表的地址里面的存的值取出來”下面看一些比較常見的應用。把數組的地址賦值給指針,然后用指針操作數組

#include “sys.h”#include “led.h”#include “delay.h”#include “usart.h”char temp[3]={1,2,3};

char *p;

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

p=temp;//將數組名賦值給指針變量p,p就指向數組temp的首地址

printf(“value0 = %d

”,*p); //p就代表數組的第一個數據的地址

printf(“value1 = %d

”,*(p+1));//p+1就代表數組的第二個數據的地址

printf(“value2 = %d

”,*(p+2));//p+2就代表數組的第三個數據的地址

printf(“temp[0] = %d

”,p[0]);//p[0]等同于temp[0]

printf(“temp[1] = %d

”,p[1]);//p[1]等同于temp[1]

printf(“temp[2] = %d

”,p[2]);//p[2]等同于temp[2]

while(1)

{

}

}

5、函數的形參是一個指針#include “sys.h”#include “led.h”#include “delay.h”#include “usart.h”char temp[3]={1,2,3};

void function(char *value)

{

printf(“value0 = %d

”,value[0]);

printf(“value1 = %d

”,value[1]);

printf(“value2 = %d

”,value[2]);

}

int main(void)

{

uart_init(115200);//串口初始化

delay_init();

function(temp);

while(1)

{

}

}

以上的指針的基本知識,多練習幾遍就可以。指針真正的應用是在于代碼的封裝。可能對于初學者感受不到其作用,但是當你成為真正的開發人員。你會發現把好多功能函數封裝起來,然后留出接口來調用是以后必不可少的。

封裝的時候會大量的使用指針、函數指針、結構體指針等,怎么說呢!90%的程序員敲的是字母,寫的是代碼。當你開始封裝的時候,你寫的便是思想,但是需要一定的基礎知識儲備才能達到。

本文編輯轉載,轉載目的在于傳遞更多信息,并不代表本網贊同其觀點和對其真實性負責。版權歸原作者所有,如涉及作品內容、版權和其它問題,請聯系我們第一時間刪除內容!

編輯:jq

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

    關注

    6035

    文章

    44554

    瀏覽量

    634669
  • RAM
    RAM
    +關注

    關注

    8

    文章

    1368

    瀏覽量

    114647
  • STM32
    +關注

    關注

    2270

    文章

    10895

    瀏覽量

    355751
  • 函數
    +關注

    關注

    3

    文章

    4327

    瀏覽量

    62573
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68526

原文標題:干貨|手把手教你寫單片機的指針

文章出處:【微信號:FANYPCB,微信公眾號:凡億PCB】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    單片機Debug工具性能對比 單片機調試常用命令

    單片機(Microcontroller Unit, MCU)調試是嵌入式開發中的一個重要環節,它幫助開發者發現和修復代碼中的錯誤,優化程序性能。不同的單片機和開發環境可能使用不同的調試工具和命令
    的頭像 發表于 12-19 09:56 ?142次閱讀

    51單片機中為什么很少出現printf的身影

    51單片機中為什么很少出現 printf 的身影?是用不了嗎? 不是的,51單片機可以用 printf,只是不建議使用。 平時我們在操作系統上C語言代碼,使用 printf 可以把數據寫到標準輸出
    的頭像 發表于 12-03 10:46 ?261次閱讀
    51<b class='flag-5'>單片機</b>中為什么很少出現printf的身影

    單片機怎么寫入程序

    單片機(Microcontroller Unit,MCU)是一種集成電路芯片,它將計算機的CPU、存儲器、輸入/輸出接口等功能集成在一個芯片上。單片機廣泛應用于嵌入式系統和物聯網設備中。編寫單片機
    的頭像 發表于 10-21 11:21 ?428次閱讀

    把esp8266加入到c51單片機單通道程序怎么

    要將ESP8266模塊加入到C51單片機的單通道程序中,您需要了解如何通過串行通信(UART)與ESP8266進行通信。以下是如何實現這一點的步驟和示例代碼。 步驟 1:硬件連接 首先,您需要
    的頭像 發表于 10-18 11:32 ?564次閱讀

    單片機的中斷機制

    單片機的中斷機制是一種重要的處理方式,它允許單片機在執行主程序的過程中,能夠暫停當前任務,轉而處理外部或內部緊急事件。這種機制極大地提高了系統的響應速度和處理能力,使得單片機在各種應用領域中得到廣泛應用。以下是對
    的頭像 發表于 10-17 18:03 ?620次閱讀

    單片機STM32可以用Python嗎?可以的開發板有哪些?

    近年來,隨著嵌入式技術的發展,Python語言逐漸被引入到單片機開發中,尤其是一些高性能的單片機上。這一趨勢給開發者帶來了極大的便利,尤其是在快速原型設計和實驗中。本文將詳細探討STM32單片機是否
    的頭像 發表于 09-05 08:00 ?3207次閱讀
    <b class='flag-5'>單片機</b>STM32可以用Python<b class='flag-5'>寫</b>嗎?可以的開發板有哪些?

    單片機燒錄程序的基本步驟是什么

    單片機燒錄程序是單片機開發過程中非常重要的一步,它涉及到將編寫好的程序代碼通過一定的方式傳輸到單片機內部的存儲器中,使單片機能夠按照預定的邏輯執行任務。 一、硬件準備
    的頭像 發表于 09-02 09:47 ?998次閱讀

    UCGUI單片機源碼

    UCGUI單片機源碼
    發表于 07-04 17:11 ?1次下載

    STM32F0系列單片機,指針取整型值錯誤的原因?

    STM32F0系列單片機,指針取整型值錯誤,用F0的進來看下,代碼如下,附件里也有個工程可以下來單步運行下,這是什么問題如何解決. uint8_t a
    發表于 05-15 07:46

    如何系統、科學地自學單片機

    很多初學者都會面臨這個問題,我想學習單片機、我也想學好單片機、我也想系統地學習單片機,但是單片機涉及到的學科多且雜根本不是三天兩天就能學完的,很多人都逃脫不了從入門到放棄的怪圈?那么我
    的頭像 發表于 03-28 08:03 ?1070次閱讀
    如何系統、科學地自學<b class='flag-5'>單片機</b>?

    單片機的最小系統由什么組成 單片機的最小系統包括哪些

    單片機(Microcontroller Unit,MCU)的最小系統包括以下幾個主要組成部分: 單片機芯片:單片機是整個最小系統的核心部分,它集成了中央處理器(Central Processing
    的頭像 發表于 02-02 11:27 ?1.1w次閱讀

    基于單片機控制的交通燈設計

    本課程設計是在學完單片機原理及課程之后綜合利用所學單片機知識完成一個單片機應用系統設計并在實驗室實現。
    的頭像 發表于 01-22 15:31 ?2049次閱讀
    基于<b class='flag-5'>單片機</b>控制的交通燈設計

    單片機原理及應用是什么

    單片機(Microcontroller)是一種集成電路(IC)芯片,其中包括了中央處理器(CPU)、存儲器和輸入/輸出(I/O)設備等功能模塊。它是一種小型計算機系統,具有獨立的工作能力和完整的計算
    的頭像 發表于 01-12 15:28 ?2149次閱讀

    示波器測單片機輸出波形怎么測

    示波器是一種用來測量和顯示電壓信號波形的儀器,廣泛應用于電子設備的調試和測試中。在單片機開發中,示波器可以用來測量單片機的輸出波形,幫助開發者進行故障排除和性能優化。本文將詳細介紹如何使用示波器測量
    的頭像 發表于 12-28 14:53 ?4245次閱讀

    AvR單片機1us延時函數數怎么

    在編寫AvR單片機的1us延時函數之前,我們首先需要了解幾個關鍵概念。 單片機的延時函數是通過控制器在特定的時間間隔內執行一系列的指令來實現的。在單片機中,我們通常使用定時器來實現延時功能。定時器
    的頭像 發表于 12-26 14:02 ?1251次閱讀
    主站蜘蛛池模板: 国产在线公开视频| 少男同志freedeos| 最近中文字幕MV免费高清在线 | 和I儿媳妇激情| 无码AV熟妇素人内射V在线| 本庄优花aⅴ全部在线影片| 免费人妻无码AV不卡在线| 中文字幕 人妻熟女| 久久re视频这里精品青| 亚洲蜜芽在线观看精品一区| 无码人妻精品一区二区蜜桃在线看 | 2019天天射干网站| 久久99免费视频| 亚洲欧美一级久久精品| 国产亚洲日韩欧美视频| 亚洲 日本 天堂 国产 在线| 国产精品嫩草影视在线观看| 甜性涩爱在线播放| 国产盗摄TP摄像头偷窥| 手机在线播放成人亚洲影院电影| 成人精品在线视频| 日本XXXXZZX片免费观看| 超碰在线97av视频免费| 人人碰79免费视频| 大桥未久在线看| 肉肉描写很细致的黄文| 高H内射NP古文| 手机在线国产视频| 国产成人拍精品视频网| 婷婷综合久久狠狠色| 国产精品免费一区二区三区四区 | 999视频精品全部免费观看| 麻豆一区二区三区蜜桃免费| 69人体阴展网| 欧美亚洲天堂网| 成人在线免费观看| 私密按摩师在线观看 百度网盘| 国产成人 免费观看| 窝窝色资源站| 国模大胆一区二区三区| 欲插爽乱浪伦骨|