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

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

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

一個(gè)簡單例子講清楚指針的應(yīng)用

Q4MP_gh_c472c21 ? 來源:嵌入式ARM ? 作者:嵌入式ARM ? 2021-02-10 17:54 ? 次閱讀

很多人遇到指針就糊涂,搞不清到底指向什么,其實(shí)是你沒搞清楚 * 修飾誰,還有一些關(guān)鍵字修飾誰。

看下面的例子,定義一個(gè)無符號(hào)字符變量x,然后同時(shí)定義一個(gè)可以指向x的指針p,即可以將x的地址放到指針變量p里面,然后又定義了一個(gè)可以存放p地址的指針pp:

#include "stdio.h"int main(void){//無符號(hào)字符變量x,指向無符號(hào)字符變量類型的指針p,指向指針類型p的指針pp.unsigned char x,*p,**pp;        x=12;        p=&x;        pp=&p;//const是修飾指針指向的對(duì)象屬性,意思是指針kp只能指向一個(gè)const常量,而kp可以被修改指向不同的const常量,但是不能通過kp指針修改指向變量的值。int const *kp,k=20,kv=32;        kp=&k;        kp=&kv;//const是修飾指針mp,mp將指向固定的地址,因此在定義的時(shí)候就應(yīng)該指定好該地址,之后無法修改該指針內(nèi)的地址。int mv=14;int *const mp=&mv;//可以讓kp指向mv的地址,但是不能通過kp,修改mv的值;                kp=&mv;/*        總結(jié):        const *p 表示*p是一個(gè)整體,即指針p指向的某個(gè)變量,而const修飾該變量;                        * const p表示const p是一個(gè)整體,const 修飾指針p,即指針p存放的地址不能變。        */printf("*p=%d
",*p);printf("**pp=%d
",**pp);printf(" p=%d
",p);printf("pp=%d
",pp);printf("pp=%d
",&pp);}
很多時(shí)候還會(huì)遇到const關(guān)鍵字,很多人不知道該如何結(jié)合,到底const修飾誰?
這里你可以將定義看成是從右到左的結(jié)合。

int const *kp;
int *const mp;

例如例子中的這兩個(gè),你看好了,從右到左

int const (*kp);
int *(const mp);

第一個(gè)括號(hào)里是表示kp指針指向的某個(gè)變量,該變量是個(gè)const常量,不可變。
第二個(gè)是const直接修飾了指針mp,意思是指針存放的內(nèi)容是不可變的,就是地址不可變。

*與&是一對(duì)逆操作,*的出現(xiàn)用于定義指針,在使用的時(shí)候用于通過指針找到指向的變量。

而&用于取出變量的地址。

在PC測試上,推薦一個(gè)C語言的IDE,是C語言入門圣經(jīng)C primer plus上推薦的一款:Pelles C IDE

86b8d9bc-5f65-11eb-8b86-12bb97331649.png

如果想使用中文界面可以訪問下面這個(gè)中文鏈接:https://www.pellesc.cn/ 例如一個(gè)指向固定地址的指針,若想修改它指向的地址,那么會(huì)報(bào)錯(cuò)

88bf8bca-5f65-11eb-8b86-12bb97331649.png

上面的報(bào)錯(cuò)信息意思是賦值錯(cuò)誤,'='的操作數(shù)有不兼容的類型'int *'和'int',分配到了固定的地址。該固定的地址是不可以被修改的。

另外需要注意,如果一個(gè)變量定義為指向常量的指針,那么該指針還是可以指向一個(gè)可變的變量,但是無法通過該指針修改該變量。該變量的屬性就是通過它操作指向的變量都當(dāng)做不可修改常量看待。

報(bào)錯(cuò)內(nèi)容如下:

896c439c-5f65-11eb-8b86-12bb97331649.png


8cd76cc8-5f65-11eb-8b86-12bb97331649.png

最后奉上,注釋掉不合法的語句后的完整學(xué)習(xí)代碼
#include "stdio.h"
int main(void){//無符號(hào)整形變量x,指向無符號(hào)整形變量類型的指針p,指向指針類型p的指針pp.        unsigned int x,*p,**pp;        x=12;        p=&x;        pp=&p;        printf("通過指針p,打印x的值12:*p=%d
",*p);        printf("通過指針pp,打印pp存放的指針p指向的變量x的值:**pp=%d
",**pp);        printf("打印變量x的地址:        &x=%p
",&x);        printf("打印指針p存放的變量x的地址:p=%p
",p);        printf("打印指針p的地址:        pp=%p
",pp);        printf("打印指針變量pp的地址:        pp=%p
",&pp);        printf("--------------------------------------------
");//const是修飾指針指向的對(duì)象屬性,意思是指針kp只能指向一個(gè)const常量,而kp可以被修改指向不同的const常量,但是不能通過kp指針修改指向變量的值。        int const *kp,k=20,kv=32;        kp=&k;        printf("通過指針kp訪問固定的數(shù)k,*kp=%d
",*kp);        kp=&kv;        printf("通過指針kp訪問固定的數(shù)kv,*kp=%d
",*kp);//        通過kp不可以修改指向地址存放變量的固定值。//        *kp=21;


//const是修飾指針mp,mp將指向固定的地址,因此在定義的時(shí)候就應(yīng)該指定好該地址,之后無法修改該指針內(nèi)的地址。        int mv=14,mx=24;        int *const mp=&mv;        printf("通過存放固定地址的指針訪問指向的變量mv=14:*mp=%d
",*mp);        *mp=15;        printf("通過存放固定地址的指針修改指向的變量mv=15:*mp=%d
",*mp);//可以讓kp指向mv的地址,但是不能通過kp,修改mv的值;                kp=&mx;        printf("將指向固定數(shù)據(jù)的指針kp指向一個(gè)可以修改的變量mx=24,*kp=%d
",*kp);//        試圖通過指向固定常量的指針kp修改指向的可修改變量mx時(shí)候,失敗了。//        *kp=25;
//因?yàn)閙p指針指向的地址是const類型,所以下面的操作是非法的,會(huì)報(bào)錯(cuò)。        //        mp=&24;
/*        總結(jié):        const *p 表示*p是一個(gè)整體,即指針p指向的某個(gè)變量,而const修飾該變量;                        * const p表示const p是一個(gè)整體,const 修飾指針p,即指針p存放的地址不能變。        */}

責(zé)任編輯:xj

原文標(biāo)題:指針的應(yīng)用,一個(gè)簡單例子講清楚你多年的糊涂

文章出處:【微信公眾號(hào):嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。


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

    關(guān)注

    1

    文章

    475

    瀏覽量

    70457
  • CONST
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    8125

原文標(biāo)題:指針的應(yīng)用,一個(gè)簡單例子講清楚你多年的糊涂

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    面試???1:函數(shù)指針指針函數(shù)、數(shù)組指針指針數(shù)組

    在嵌入式開發(fā)領(lǐng)域,函數(shù)指針指針函數(shù)、數(shù)組指針指針數(shù)組是些非常重要但又容易混淆的概念。理解它們的特性和應(yīng)用場景,對(duì)于提升嵌入式程序的效率
    的頭像 發(fā)表于 08-10 08:11 ?315次閱讀
    面試???1:函數(shù)<b class='flag-5'>指針</b>與<b class='flag-5'>指針</b>函數(shù)、數(shù)組<b class='flag-5'>指針</b>與<b class='flag-5'>指針</b>數(shù)組

    阿里云設(shè)備的物模型數(shù)據(jù)里面始終沒有值是為什么?

    如上圖,不知道講清楚沒有。 IG502自定義TOPIC 上發(fā)到阿里云沒問題。采用阿里云物模型的格式來上發(fā)就不行。請(qǐng)大佬指教!
    發(fā)表于 07-24 07:49

    面試中的高頻問題:指針函數(shù)與函數(shù)指針,你能完美應(yīng)對(duì)嗎?

    直覺得C語言較其他語言最偉大的地方就是C語言中的指針,有些人認(rèn)為指針簡單,而有些人認(rèn)為指針很難,當(dāng)然這里的對(duì)
    的頭像 發(fā)表于 06-22 08:11 ?884次閱讀
    面試中的高頻問題:<b class='flag-5'>指針</b>函數(shù)與函數(shù)<b class='flag-5'>指針</b>,你能完美應(yīng)對(duì)嗎?

    M8連接器對(duì)使用環(huán)境有什么要求,篇文章講清楚!

    M8連接器對(duì)使用環(huán)境有什么要求?德索精密工業(yè),專業(yè)生產(chǎn)M8連接器十八年,歡迎前來采購M8相關(guān)產(chǎn)品。任何產(chǎn)品在使用中,或多或少對(duì)使用環(huán)境都有定的要求,由于統(tǒng)物體在不同環(huán)境中的技術(shù)機(jī)能也會(huì)發(fā)生改變
    的頭像 發(fā)表于 03-18 16:39 ?289次閱讀
    M8連接器對(duì)使用環(huán)境有什么要求,<b class='flag-5'>一</b>篇文章<b class='flag-5'>講清楚</b>!

    函數(shù)指針與回調(diào)函數(shù)的應(yīng)用實(shí)例

    通常我們說的指針變量是指向個(gè)整型、字符型或數(shù)組等變量,而函數(shù)指針是指向函數(shù)。 函數(shù)指針可以像
    的頭像 發(fā)表于 03-07 11:13 ?315次閱讀
    函數(shù)<b class='flag-5'>指針</b>與回調(diào)函數(shù)的應(yīng)用實(shí)例

    干貨!收藏!講清楚數(shù)據(jù)治理到底是什么?

    數(shù)據(jù)治理的兩個(gè)目標(biāo):一個(gè)是提質(zhì)量,一個(gè)是控安全。通過業(yè)務(wù)流程優(yōu)化,規(guī)范數(shù)據(jù)從產(chǎn)生、處理、使用到銷毀的整個(gè)生命周期,使得數(shù)據(jù)在各階段、各流程環(huán)節(jié)安全可控,合規(guī)使用。 數(shù)據(jù)治理治的是“數(shù)據(jù)”嗎? 數(shù)據(jù)
    的頭像 發(fā)表于 02-01 10:40 ?356次閱讀
    干貨!收藏!<b class='flag-5'>一</b>文<b class='flag-5'>講清楚</b>數(shù)據(jù)治理到底是什么?

    函數(shù)指針指針函數(shù)是不是個(gè)東西?

    函數(shù)指針的本質(zhì)是指針,就跟整型指針、字符指針樣,函數(shù)指針指向的是
    的頭像 發(fā)表于 01-03 16:35 ?428次閱讀
    函數(shù)<b class='flag-5'>指針</b>和<b class='flag-5'>指針</b>函數(shù)是不是<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>東西?

    數(shù)組與指針不能混用的情況

    指針的基本概念。數(shù)組是組相同類型的元素的集合,而指針個(gè)變量,它存儲(chǔ)了
    的頭像 發(fā)表于 12-07 13:46 ?489次閱讀

    指針是什么

    指針是什么? 1.1 淺談指針 理解指針的 兩個(gè)要點(diǎn): 指針是內(nèi)存中
    的頭像 發(fā)表于 11-24 15:50 ?1764次閱讀
    <b class='flag-5'>指針</b>是什么

    for循環(huán)的基本例子

    for循環(huán)是種常見的循環(huán)結(jié)構(gòu),用于重復(fù)執(zhí)行段代碼。它通常由三個(gè)部分組成:循環(huán)變量的初始化、循環(huán)條件和循環(huán)變量更新。下面將通過詳細(xì)的例子來解釋for循環(huán)的用法和工作原理。 首先,我們
    的頭像 發(fā)表于 11-22 10:00 ?1747次閱讀

    python最簡單for循環(huán)例子

    Python是簡單而又強(qiáng)大的編程語言,通過其清晰的語法和豐富的功能庫,我們可以實(shí)現(xiàn)各種各樣的任務(wù)。其中個(gè)最基本的語法結(jié)構(gòu)就是for循環(huán),讓我們來看
    的頭像 發(fā)表于 11-21 14:53 ?763次閱讀

    文認(rèn)識(shí)壓敏電阻

    今天這篇文章用5000字的篇幅講清楚壓敏電阻。
    的頭像 發(fā)表于 11-20 17:34 ?3226次閱讀
    <b class='flag-5'>一</b>文認(rèn)識(shí)壓敏電阻

    C++智能指針的底層實(shí)現(xiàn)原理

    C++智能指針的頭文件: #include 1. shared_ptr: 智能指針從本質(zhì)上來說是個(gè)模板類,用類實(shí)現(xiàn)對(duì)指針對(duì)象的管理。 te
    的頭像 發(fā)表于 11-09 14:32 ?573次閱讀
    C++智能<b class='flag-5'>指針</b>的底層實(shí)現(xiàn)原理

    常見的級(jí)指針參數(shù)有什么作用

    先來看個(gè)最常用函數(shù)模型,函數(shù)func()參數(shù)為個(gè)uint8_t 的指針類型,那這個(gè)函數(shù)有什么作用?
    的頭像 發(fā)表于 10-24 14:35 ?422次閱讀
    常見的<b class='flag-5'>一</b>級(jí)<b class='flag-5'>指針</b>參數(shù)有什么作用

    講清楚PLC應(yīng)用系統(tǒng)設(shè)計(jì)與調(diào)試的主要步驟

    設(shè)計(jì)應(yīng)用系統(tǒng)梯形圖程序 根據(jù)工作功能圖表或狀態(tài)流程圖等設(shè)計(jì)出梯形圖即編程。這步是整個(gè)應(yīng)用系統(tǒng)設(shè)計(jì)的最核心工作,也是比較困難的步,要設(shè)計(jì)好梯形圖,首先要十分熟悉控制要求,同時(shí)還要有定的電氣設(shè)計(jì)的實(shí)踐經(jīng)驗(yàn)。
    的頭像 發(fā)表于 10-08 16:21 ?1237次閱讀
    <b class='flag-5'>一</b>文<b class='flag-5'>講清楚</b>PLC應(yīng)用系統(tǒng)設(shè)計(jì)與調(diào)試的主要步驟