IT培训机构|91免费精品视频|专注编程培训|91免费精品|软件开发培训_91免费国产视频_华清远见教育

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > C語言指針

C語言指針 時間:2018-12-25      來源:華清遠(yuǎn)見

關(guān)于指針我上學(xué)的時候?qū)W,我的老師說“指針很難呢“,把指針比喻成門牌號,信封郵寄地址,現(xiàn)在我看到指針就想起門牌號,信封地址。

地址:

說到指針,先說說地址,看一段小程序

#include "stdio.h"

int main()

{

    int a = 10;

    int *p = &a;

    printf("%p\n", p);

    return 0;  

}

// output

0x7fff8b6a378c

每當(dāng)我看到指針的輸出 像這種"0x7fff8b6a378c"時候,頭都大了,那時候老師說是地址,搞得糊里糊涂的。那什么是地址呢?當(dāng)然我?guī)湍惆倏埔幌隆J窍到y(tǒng) RAM 中的特定位置,通常以十六進(jìn)制的數(shù)字表示,系統(tǒng)通過這個地址,就可以找到相應(yīng)的內(nèi)容。當(dāng)使用80386時,我們必須區(qū)分以下三種不同的地址:邏輯地址、線性地址、物理地址;在進(jìn)行C語言指針編程中,可以讀取指針變量本身值(&操作),實(shí)際上這個值就是邏輯地址,它是相對于你當(dāng)前進(jìn)程數(shù)據(jù)段的地址(偏移地址),不和絕對物理地址相干,比如上面那個"0x7fff8b6a378c" 就是邏輯地址。邏輯地址不是被直接送到內(nèi)存總線,而是被送到內(nèi)存管理單元(MMU)。MMU由一個或一組芯片組成,其功能是把邏輯地址映射為物理地址,即進(jìn)行地址轉(zhuǎn)換。下面是轉(zhuǎn)換關(guān)系圖。

C語言指針,C語言學(xué)習(xí)

指針:

c語言相比匯編算應(yīng)該算是高級了,卻保留的了操作地址中高效的又抽象的形式。那么指針到底是什么呢? 在那本經(jīng)典《c 程序設(shè)計語言》 是這樣描述 : ”指針是一種保存變量地址的變量“,指針是一個特殊的變量,它里面存儲的數(shù)值被解釋成為內(nèi)存里的一個地址,指針與地址不要混在一起,指針是存儲地址一個變量,地址是內(nèi)存分配。指針可以指向這個內(nèi)存地址,也可以指向另一個內(nèi)存地址,當(dāng)指針指向一個內(nèi)存地址,它們之間才發(fā)生聯(lián)系,通過這個指針去操作這塊內(nèi)存,所以指針把我們帶入到地址層面去操作數(shù)據(jù),在php,java 這些高級語言沒有這一層的操作。舉個例子 

//字符串翻轉(zhuǎn)例子

#include "stdio.h"

#include "string.h"

void revstr(char *);

int main()

{

    char str[] = "Zhen Shan Ren is good!";

    revstr(str);

    puts(str);

}

void revstr(char *str) 

{

    char *start, *end, temp;

    start = str;

    end = start + strlen(str) -1;

    while (start++ < end--) {

        temp = *start;

        *start = *end;

        *end = temp;

    }

}

上面的例子是從指針的角度去處理字符串,我再revstr 函數(shù)中定義了兩個指針,一個指針指向字符串的首地址,另一個指針指向字符串的末地址,把內(nèi)容互換。 指針提供這樣便利,可以通過加、減來訪問這一塊內(nèi)存。然后再去改變內(nèi)存的值。如果沒有指針,只能去操作這樣邏輯地址 “0x7fff8b6a378c”去計算下一個或上一個邏輯地址,會不會瘋掉呢?所以指針把我們帶入到地址層面去操作數(shù)據(jù)。指針難點(diǎn)是我們不是很清楚有些復(fù)雜的數(shù)據(jù)類型的在內(nèi)存中存儲。指來指去不知道指向那了。如果你能很清楚內(nèi)存的分布,就不會指錯地方!

指針的幾個概念:

1.指針的類型:

基本數(shù)據(jù)類型比如 int、char ,還有 一些復(fù)雜的比如 int (*p)[], 指向數(shù)組的指針,像這種的判斷就是指針名字去掉 , 指針的類型類型就是 int(*)[],其實(shí)就是指向數(shù)組的指針

2.指針?biāo)赶虻念愋停?/p>

當(dāng)你通過指針來訪問指針?biāo)赶虻膬?nèi)存區(qū)時,指針?biāo)赶虻念愋蜎Q定了編譯器將把那片內(nèi)存區(qū)里的內(nèi)容當(dāng)做什么來看待。  你只須把指針聲明語句中的指針名字和名字左邊的指針聲明符*去掉,剩下的就是指針?biāo)赶虻念愋汀?/p>

例如:int*ptr:指針?biāo)赶虻念愋褪莍nt   int(*ptr)[3]:指針?biāo)赶虻牡念愋褪莍nt()[3] 

3.指針的值:

我們說一個指針的值是XX,就相當(dāng)于說該指針指向了以XX為首地址的一片內(nèi)存區(qū)域;我們說一個指針指向了某塊內(nèi)存區(qū)域,就相當(dāng)于說該指針的值是這塊內(nèi)存區(qū)域的首地址。 

看一段代碼:這段代碼是問你p1 是否和p2 相等?

#include "stdio.h"

int main()

{

    char *p1,*p2,*p3;

    char ch[] = {'a', 'b', 'c'};

    char **pp;

    p1 = ch;

    pp = &ch;

    p2 = *pp;

    if (p1 == p2) {

      printf("p1  == p2\n");

    } else {

      printf("p1 != p2\n");

    }

    printf("p3 = %p", p3);

    return 0;

}

  結(jié)果是:

//p1 != p2

//p3 = 0x4005f0dxy

&ch  指針類型為 char (*)[3], 當(dāng)運(yùn)行到pp=&ch 時候,編譯器會罵你 “warning: assignment from incompatible pointer type” 指針類型不匹配(在vc6下直接報錯)。看一下p3 會有一個值,未初始化指針是有內(nèi)存地址的,而且是一個垃圾地址。不知道這個內(nèi)存地址指向的值是什么。這就是為什么不要對未初始化指針取值的原因。最好的情況是你取到的是垃圾地址接下來你需要對程序進(jìn)行調(diào)試,最壞的情況則會導(dǎo)致程序崩潰。以后,每遇到一個指針,都應(yīng)該問問:這個指針的類型是什么?指針指的類型是什么?該指針指向了哪里?  

還有一個題目可以試試

#include "stdio.h"

int main()

{

  int a[5] = {1,2,3,4,5};

  int *p = (int *)(&a+1);

  printf("%d,%d", *(a+1), *(p-1));

}

 

答案在此

指針與數(shù)組 

“數(shù)組名就是指針”,“你就把當(dāng)做指針理解”,假設(shè)數(shù)組名是指針

#include "stdio.h"

 

int main()

{

int a[] = {1,2,3,5};

int *p = a;

printf("a = %d, p =%d", sizeof(a), sizeof(p));

}

//output

//a= 16,p=4

從輸出結(jié)果看兩者根本就是兩個事物,只能說數(shù)組名神似指針,數(shù)組名的內(nèi)涵在于其指代實(shí)體是一種數(shù)據(jù)結(jié)構(gòu),這種數(shù)據(jù)結(jié)構(gòu)就是數(shù)組;那么數(shù)組名到底是什么:

符號表是編譯原理中的一個概念,應(yīng)用于編譯器的詞法分析和語義分析兩個階段。詞法分析的目標(biāo)是讓編譯器能知道這是個數(shù)組就好了,那么語義分析階段就需要確定這個數(shù)組的具體空間了。所以我們定義了一個數(shù)組,編譯器就會在符號表中加入數(shù)組的名字a,并且根據(jù)其指定的大小,開辟一段內(nèi)存空間,把這段內(nèi)存空間的首地址(也就是第一個元素的地址)存入符號表,這也就是為什么我們通過數(shù)組名就可以去訪問數(shù)組的元素了。編譯器這么做是為了使我們使用數(shù)組更加的方便,易懂。也有人說a是一個內(nèi)存地址,也沒有什么不妥的,因?yàn)榫幾g器允許我們直接把a(bǔ)作為數(shù)組首地址來用。數(shù)組是一種線性的數(shù)據(jù)結(jié)構(gòu),數(shù)組名指向了那一片內(nèi)存。

上一篇:嵌入式學(xué)科:float

下一篇:干貨分享 javasleep

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號-5京公海網(wǎng)安備11010802025203號

回到頂部

主站蜘蛛池模板: 振动给料机_电磁振动给料机_振动给料机厂家-新乡市大汉振动机械有限公司 | 上海专升本-上海统招专升本网| 西安西雷脉冲功率技术有限公司-高压调制器/加速器与脉冲功率系统的研发/生产/应用推广/高压脉冲电源的应用研究/设计/生产和销售/高功率脉冲器件/材料与仪器设备的研发/生产和销售/高电压/大电流/强磁场环境的模拟及测试服务/会议会展服务/货物及进出口的业务/脉冲功率技术领域类的技术转让 | 深圳固派克包装机械科技有限公司_封口收缩机_封箱机-捆包机-缠膜机 | 金煌家装官网-长沙装饰|长沙装修|长沙装修公司|长沙装饰公司-金煌家装 | 江西省屹诚建筑装饰工程有限公司 | 江苏减速机_常州减速机_摆线减速机_摆线针轮减速机 | 乌鲁木齐万疆通管道设备有限公司 销售热线;13565955557-新疆 乌鲁木齐 万疆通 管道设备 波纹补偿器 膨胀节 金属软管 伸缩器 管件 阀门 维修 | 汽车轴承|圆锥滚子轴承|轴承生产厂家|赛襄轴承 | 驾驶洗地机|手推洗地车|天津洗地机|扫地车|仓库工厂扫地机|工业吸尘器|扫雪机|耐洁思 | 售后服务认证-五星级物业售后服务体系认证证书-ISO27001信息安全管理体系认证证书查询认E云-湖北省贯标企业管理咨询有限公司 | 喜来顺财经-专注于财经领域的综合性网站 | 新密耐火材料厂家价格-河南郑州荣盛窑炉耐火材料有限公司 | 喷涂流水线,喷漆流水线-山东天意设备科技| 钻床,数控钻床,摇臂钻床,立式钻床_滕州市高地机床有限公司 | 南京三维动画制作公司,企业视频制作,视频拍摄,FLASH动画设计,宣传片拍摄,广告片制作 | 十树品牌策划—品牌战略、品牌策划、品牌定位、品牌设计、包装设计、品牌营销-上海十树品牌管理咨询有限公司官网 | 上海浩斌信息科技有限公司RFID读写器,IC卡读卡器,手持机,数据采集终端,电力仓库管理软件开发,固定资产软件,纱管标签,试剂管理,RFID试剂柜,档案管理,档案柜,智能货架 | 气动隔膜调节阀,气动比例调节隔膜阀|川熙流体设备百科 | 深圳办公室装修_高端写字楼设计费用_企业装修报价公司-深圳长红装饰 | 活性氧化铝球-活性氧化铝干燥剂厂家价格-3A-5A分子筛-巩义市亿洋水处理材料有限公司 | 交通标志牌-交通标牌-铝圆牌-铝三角片-铝滑槽-公路警示指示牌-方牌-高速道路反光牌毛坯-交通设施安全警示标识牌-路名指示限速限高牌-厂家加工交通标牌铝板半成品毛坯-上海吕盟铝业有限公司 | 南京叉车|电瓶叉车|电动叉车|电动堆高车|电动搬运车-南京诺嘉机械 | 上海机械网 机械 机械加工 金属加工 上海机械网 机械设备 上海机械 | 企业微信注册_CRM客户管理系统_SCRM解决方案_私域流量运营_腾讯企点服务_企业QQ-腾辉网络 | 联系我们果博东方公司福布斯客服电话| 济宁三石工程机械有限公司-首页-小型起重机、环卫设备、小松配件 | 萘系减水剂|缓凝|早强|聚羧酸|混凝土|石膏板|管桩减水剂厂家-潍坊英宏建材有限公司 | 洗地机_扫地机_扫地车品牌_尘推车_工业吸尘器_山东鼎洁盛世 | 陶瓷-超高速胶体磨-高剪切胶体磨厂家价格-上海思峻机械设备有限公司 | 柔性电缆-专业机器人电缆,拖链电缆生产厂家 | 上海教师招聘考试网_上海编制教师招聘网| 全自动包装机械设备_液体灌装机-迈驰日化包装流水线厂家 | 展馆周边酒店_会展中心附近酒店_展览旅游酒店预订官网-盟友云 | 耐腐蚀磁力泵,直立式耐酸碱泵,立式耐酸碱泵,自吸式耐酸碱泵-杰凯泵业【官网】 | 气体泄漏检测仪,COD水质分析仪,RD8200管线探测仪-成都恒通兴业科技有限责任公司 | 首页 网络安全与数据治理(原《信息技术与网络安全》) | 全自动拆包机,自动拆包机,全自动逐层拆包机,全自动吨袋拆包机,吨袋拆包机,管链输送机,气流分级机 | 助乐邦轮椅,北京轮椅置换,电动轮椅置换,轮椅回收北京,轮椅送货上门服务 | 水热反应釜厂家_水热反应釜价格_水热合成反应釜批发-仪贝尔仪器 - 水热釜,水热反应釜,水热反应釜厂家,水热反应釜价格,水热反应釜型号,水热反应釜内衬,水热反应釜25ml,水热反应釜50ml,水热反应釜100ml,水热合成反应釜 | 永磁电机,防爆电机,调速电机,永磁同步电机_河南华信电机股份有限公司 |