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

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

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

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

C語(yǔ)言中指針的命令行參數(shù)

C語(yǔ)言編程學(xué)習(xí)基地 ? 來(lái)源:C語(yǔ)言編程學(xué)習(xí)基地 ? 作者:C語(yǔ)言編程學(xué)習(xí)基地 ? 2022-09-26 10:18 ? 次閱讀

指針是C語(yǔ)言最重要也是最難理解的部分,它在我們平時(shí)的工作中無(wú)處不在。

今天我們繼續(xù)來(lái)看看指針的剩下的知識(shí)總結(jié)吧!上一批的話可以在主頁(yè)看到哦~

4c3c116e-3bdc-11ed-9e49-dac502259ad0.png

5 指針與結(jié)構(gòu)體

一個(gè)指針,它指向的可以是一個(gè)結(jié)構(gòu)體類(lèi)型,這稱(chēng)為結(jié)構(gòu)體指針。而一個(gè)結(jié)構(gòu)體,它的成員中也可以有指針成員。

struct{    char *name;  //姓名    int num;  //學(xué)號(hào)    int age;  //年齡    char group;  //所在小組    float score;  //成績(jī)} stu1 = { "Tom", 12, 18, 'A', 136.5 }, *pstu = &stu1;

上面的代碼中,定義了一個(gè)結(jié)構(gòu)體變量stu1。這個(gè)變量中有一個(gè)指針變量name。還定義了一個(gè)結(jié)構(gòu)體指針pstu。

我們想要通過(guò)結(jié)構(gòu)體指針訪問(wèn)結(jié)構(gòu)體成員一般有以下兩種方式:

(*pstu).name;pstu->name;

6 指針與const:常量指針與指針常量

初學(xué)者常常對(duì)這兩個(gè)概念搞錯(cuò)。首先,我認(rèn)為需要理解這里說(shuō)的常量是什么意思。常量就是只可讀不可修改的。那常量指針和指針常量到底哪個(gè)是只可讀不可修改的呢?是指針還是指針指向的內(nèi)容?這里有一個(gè)方法,能讓你迅速明白哪個(gè)是不可修改的。就是在聲明時(shí),以星號(hào)(*)為界,分成兩部分,星號(hào)左邊的和星號(hào)右邊的。const在哪邊,那個(gè)就是只可讀不可修改的。以下面這個(gè)代碼為例,我們來(lái)分析一下:以星號(hào)(*)為界,星號(hào)左邊是char,沒(méi)有const關(guān)鍵詞,所以它指向的內(nèi)容不是常量。然后,我們看星號(hào)的右邊是const ptr,所以我們可以說(shuō)ptr是一個(gè)常量。所以,這行代碼聲明了一個(gè)是常量的指針但是指向的內(nèi)容不是常量。即這個(gè)是一個(gè)指針常量。

char* const ptr = "just a string";

類(lèi)似的,我們也可以分析下面的代碼:

// Neither the data nor the pointer are const//char* ptr = "just a string";
// Constant data, non-constant pointer//const char* ptr = "just a string";
// Constant pointer, non-constant data//char* const ptr = "just a string";
// Constant pointer, constant data//const char* const ptr = "just a string";

6.1 指針常量(Constant Pointers)

指針常量(Constant Pointers): 它的本質(zhì)是一個(gè)常量,只不過(guò)這個(gè)常量是指針。由于指針是只可讀不可修改的,所以這個(gè)指針不能指向別的地址了,但是該地址里的內(nèi)容還是可以改變的。指針常量的聲明格式如下:

 * const 例如: int * const ptr;

我們來(lái)看下序:

#includeint main(void){    int var1 = 0, var2 = 0;    int *const ptr = &var1;    ptr = &var2;    printf("%d
", *ptr);
    return 0;}

上面這段程序中:

我們首先定義了兩個(gè)變量var1,var2;

然后,定義了一個(gè)指針常量ptr,并且指向了var1

接著,試圖讓ptr指向var2

最后,打印出指針ptr指向的地址的內(nèi)容

讓我們來(lái)運(yùn)行一下這個(gè)程序:

main.c: In function 'main':main.c9: error: assignment of read-only variable 'ptr'     ptr = &var2;         ^

我們看到這個(gè)程序編譯報(bào)錯(cuò)了:試圖對(duì)只讀(read-only)變量ptr進(jìn)行賦值。所以,一旦我們定義了指針常量,那這個(gè)指針就不能指向其他變量了。

但是我們還是可以修改指向的地址里的內(nèi)容的:

#includeint main(void){    int var1 = 0;    int *const ptr = &var1;    *ptr = 10; // OK    printf("%d
", *ptr); // 10    return 0;}

6.2 常量指針(Pointer to Constants)

常量指針(Pointer to Constants):它的本質(zhì)是一個(gè)指針,只不過(guò)它指向的值是常量(只可讀,不可修改)。由于指向的是一個(gè)只可讀不修改的值,所以指針不能通過(guò)它存儲(chǔ)的地址間接修改這個(gè)地址的值,但是這個(gè)指針可以指向別的變量。

常量指針的聲明格式如下:

const * 例如: const int* ptr;

還是有一段程序:

#include
int main(void){    int var1 = 0;    const int* ptr = &var1;    *ptr = 1;    printf("%d
", *ptr);
    return 0;}

我們還是來(lái)分析一下這個(gè)程序:

我們定義了一個(gè)變量 var1,并且初始化為0

然后我們定義了一個(gè)指針常量ptr,并且將它指向了var1

接著,試圖通過(guò)指針ptr來(lái)改變var1的值

最后,打印出ptr指向的地址的內(nèi)容。

我們進(jìn)行編譯:

main.c: In function 'main':main.c10: error: assignment of read-only location '*ptr'     *ptr = 1;          ^

編譯報(bào)錯(cuò)也很明顯: *ptr是一個(gè)只讀的。所以不能通過(guò)ptr來(lái)修改var1的值。

但是,我們可以將ptr指向其他的變量:

#include
int main(void){    int var1 = 0;    const int* ptr = &var1;    printf("%d
", *ptr); // 0    int var2 = 20;    ptr = &var2; // OK    printf("%d
", *ptr); // 20    return 0;}

6.3 指向常量的常量指針

理解了上面兩種類(lèi)型的話,理解這個(gè)就很容易了。指向常量的常量指針是指這個(gè)指針既不能指向其他的地址也不能通過(guò)地址修改內(nèi)容。

它的聲明格式如下:

const * const 例如: const int* const ptr;

同樣,下面一段程序,我想你一定知道哪里編譯錯(cuò)誤了。

#include
int main(void){    int var1 = 0,var2 = 0;    const int* const ptr = &var1;    *ptr = 1;    ptr = &var2;    printf("%d
", *ptr);
    return 0;}

編譯結(jié)果:

main.c: In function 'main':main.c10: error: assignment of read-only location '*ptr'     *ptr = 1;          ^main.c9: error: assignment of read-only variable 'ptr'     ptr = &var2;         ^

7 指針與函數(shù)

7.1 函數(shù)指針

指針與函數(shù)相結(jié)合有兩種情況:指針函數(shù)、函數(shù)指針。

指針函數(shù),它的本質(zhì)是一個(gè)函數(shù),它的返回值是一個(gè)指針。

int * func(int x, int y);

函數(shù)名本身就是一個(gè)指針(地址),這個(gè)地址就是函數(shù)的入口地址。

#include int sum(int a, int b){  return a + b;} int main(){  printf("%p
", sum);  return 0;}

輸出:

0000000000401550

而函數(shù)指針,它的本質(zhì)是一個(gè)指針。只不過(guò)它存的地址恰好是一個(gè)函數(shù)的地址罷了。

函數(shù)指針變量定義的格式一般是:

返回值 (*變量名)(參數(shù)列表)

比如:

#include int sum(int a, int b){    return a + b;} int main(){    printf("%p
", sum);    int (*psum)(int, int);  // 函數(shù)指針變量,參數(shù)名可以省略    psum = sum;    printf("%p
", psum);    return 0;}

輸出:

00000000004015500000000000401550

可以發(fā)現(xiàn),兩者地址相等。

函數(shù)指針類(lèi)型的定義:

typedef  返回值 (* 類(lèi)型名)(參數(shù)列表);復(fù)制代碼

比如:

typedef int(*PSUM)(int, int);PSUM pSum2 = sum;PSUM pSum3 = sum;
?

這樣的好處就是,首先通過(guò)typedef定義一個(gè)函數(shù)指針類(lèi)型PSUM,定義完后,PSUM就相當(dāng)于一種新的類(lèi)型,可以用此類(lèi)型去定義其他函數(shù)指針變量,就不用每次都使用int(*pSum)(int, int);來(lái)定義一個(gè)函數(shù)指針變量。

#include int sum(int a, int b){    return a + b;}int func2(int a, int b){    return a - b;}typedef int (*PFUNC) (int, int);int main(){    int (*psum)(int, int);    psum = sum;    printf("psum(4, 5):%d
", psum(4, 5));    PFUNC p2 = func2;    printf("p2(5, 2):%d
", p2(5, 2));    p2 = sum;    printf("p2(5, 2):%d
", p2(5, 2));    return 0;}

輸出:

psum(4, 5):9p2(5, 2):3p2(5, 2):7

7.2 回調(diào)函數(shù)

說(shuō)到函數(shù)指針,那還有一個(gè)概念不得不提——回調(diào)函數(shù)。因?yàn)樵趯?shí)際的項(xiàng)目代碼中實(shí)在是太常見(jiàn)了。

回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來(lái)調(diào)用其所指向的函數(shù)時(shí),我們就說(shuō)這是回調(diào)函數(shù)。

那為什么要使用回調(diào)函數(shù)呢?或者說(shuō)使用回調(diào)函數(shù)有什么好處呢?回調(diào)函數(shù)允許用戶把需要調(diào)用的方法的指針作為參數(shù)傳遞給一個(gè)函數(shù),以便該函數(shù)在處理相似的事情時(shí),可以靈活的使用不同的方法。

怎么使用回調(diào)函數(shù):

#include int Callback_1(int a)   ///< 回調(diào)函數(shù)1{    printf("Hello, this is Callback_1: a = %d 
", a);    return 0;}
int Callback_2(int b)  ///< 回調(diào)函數(shù)2{    printf("Hello, this is Callback_2: b = %d 
", b);    return 0;}
int Callback_3(int c)   ///< 回調(diào)函數(shù)3{    printf("Hello, this is Callback_3: c = %d 
", c);    return 0;}
int Handle(int x, int (*Callback)(int)) // 注意這里用到的函數(shù)指針定義{    Callback(x);}
int main(){    Handle(4, Callback_1);    Handle(5, Callback_2);    Handle(6, Callback_3);    return 0;}

如上述代碼:可以看到,Handle()函數(shù)里面的參數(shù)是一個(gè)指針,在main()函數(shù)里調(diào)用Handle()函數(shù)的時(shí)候,給它傳入了函數(shù)Callback_1()/Callback_2()/Callback_3()的函數(shù)名,這時(shí)候的函數(shù)名就是對(duì)應(yīng)函數(shù)的指針,也就是說(shuō),回調(diào)函數(shù)其實(shí)就是函數(shù)指針的一種用法。

8 二維指針

二維指針,或者二級(jí)指針。就是指向指針的指針。比如:

#includeint main(){    int a = 10;    int *pa = &a;    int **ppa = &pa;    printf("%p, %p, %p, %p, %p", a, pa, *pa, ppa, *ppa);    return 0;}

輸出如下:

000000000000000A, 000000000061FE14, 000000000000000A, 000000000061FE08, 000000000061FE14

從輸出結(jié)果也可以看到,pa存的內(nèi)容*pa= 000000000000000A,剛好與a的地址相同。而ppa存的內(nèi)容*ppa= 000000000061FE14也剛好等于pa的地址。它們之間的內(nèi)存關(guān)系可以用如下的圖表示:

4c50c62c-3bdc-11ed-9e49-dac502259ad0.png

8.1 命令行參數(shù)

處理命令行參數(shù)是指向指針的指針的一個(gè)用武之地。

一般main函數(shù)具有兩個(gè)形參。第一個(gè)通常稱(chēng)為argc,它表示命令行參數(shù)的數(shù)目。第2個(gè)通常稱(chēng)為argv,它指向一組參數(shù)值。由于參數(shù)的數(shù)目并沒(méi)有內(nèi)在的限制,所以argv指向這組參數(shù)值(從本質(zhì)上來(lái)說(shuō)是一個(gè)數(shù)組)的第一個(gè)元素。這些元素的每個(gè)都是指向一個(gè)參數(shù)文本的指針。如果程序需要訪問(wèn)命令行參數(shù),main函數(shù)在聲明時(shí)就要加上這些參數(shù)。

【int main(int argc, char **argv)

舉例:

#include 
int main(int argc, char *argv[]){    printf("argc: %d
", argc);
    // 打印參數(shù),直到遇到NULL指針。程序名被跳過(guò)    while (*++argv != NULL) {        printf("%s
", *argv);    }    return 0;}

在windows上執(zhí)行: est2.exe hello world

argc: 3helloworld

注意,如果命令行中傳遞的一個(gè)參數(shù)包括空格,就需要用 ""將參數(shù)括起來(lái),比如:

. est2.exe "hello word"

則上面的代碼將輸出:

argc: 2hello word

9 結(jié)束語(yǔ)

本文關(guān)于指針的講解就結(jié)束了。我相信你一定對(duì)指針有更深入的了解。

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

    關(guān)注

    180

    文章

    7630

    瀏覽量

    140699
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4374

    瀏覽量

    64382
  • 指針
    +關(guān)注

    關(guān)注

    1

    文章

    484

    瀏覽量

    71067

原文標(biāo)題:C語(yǔ)言基礎(chǔ)知識(shí):最核心的—指針!知識(shí)總結(jié)(第二部分)

文章出處:【微信號(hào):cyuyanxuexi,微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    C語(yǔ)言中指針的定義

    上一節(jié)中,我們利用了一個(gè)小知識(shí)來(lái)介紹了一下指針,在上面這個(gè)例子中,小明和小麗手中的這個(gè)杯子就好比我們C語(yǔ)言中的變量,它確實(shí)是實(shí)實(shí)在在存放一些有具體意義的數(shù)據(jù)。這個(gè)杯套就類(lèi)似于C
    發(fā)表于 08-15 16:24 ?2017次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言中指針</b>的定義

    C語(yǔ)言中指針函數(shù)和函數(shù)指針的概念及應(yīng)用示例

    C語(yǔ)言中指針函數(shù)和函數(shù)指針是強(qiáng)大且常用的工具。它們?cè)试S我們以更靈活的方式處理函數(shù)和數(shù)據(jù),進(jìn)而擴(kuò)展程序的功能。
    發(fā)表于 08-16 16:14 ?1538次閱讀

    C語(yǔ)言中指針的基本概念和用法

    C語(yǔ)言中指針是一項(xiàng)重要的概念,它允許我們直接訪問(wèn)和操作內(nèi)存地址。
    發(fā)表于 08-17 15:30 ?1160次閱讀

    談?wù)?b class='flag-5'>C語(yǔ)言中指針有什么好處,請(qǐng)各位高手們談?wù)勛约旱捏w會(huì)

    談?wù)?b class='flag-5'>C語(yǔ)言中指針有什么好處,請(qǐng)各位高手們談?wù)勛约旱捏w會(huì)...
    發(fā)表于 09-01 17:38

    C語(yǔ)言入門(mén)教程-命令行參數(shù)

    命令行參數(shù)C中,獲取用戶輸入的命令行參數(shù)是很方便的。程序的主函數(shù)會(huì)接受一個(gè)argv參數(shù)。有
    發(fā)表于 07-29 14:22 ?2695次閱讀

    caxa命令行中的應(yīng)用

    caxa命令行中的應(yīng)用 命令行對(duì)于大多用戶來(lái)說(shuō)往往只是輸入數(shù)據(jù)的作用,但是其中的奧妙還有很多,下面就給大家
    發(fā)表于 10-18 18:18 ?2405次閱讀

    C語(yǔ)言中指針的介紹非常詳細(xì)

    C語(yǔ)言中指針的介紹非常詳細(xì) C語(yǔ)言中指針的介紹非常詳細(xì)
    發(fā)表于 12-25 10:39 ?57次下載

    CMD的命令行高級(jí)教程

    CMD的命令行高級(jí)教程
    發(fā)表于 10-24 08:31 ?30次下載
    CMD的<b class='flag-5'>命令行</b>高級(jí)教程

    基于C語(yǔ)言中指針的基本用法解析

    C語(yǔ)言中其它的知識(shí)都學(xué)得可以,唯獨(dú)指針搞不懂。如果是這樣,我可以很負(fù)責(zé)的告訴你,對(duì)于這門(mén)編程語(yǔ)言,你等于是沒(méi)學(xué)。所以學(xué)好指針對(duì)于初學(xué)者是非
    的頭像 發(fā)表于 01-09 15:12 ?4980次閱讀

    C語(yǔ)言中一個(gè)簡(jiǎn)單的實(shí)例,檢查命令行是否有提供參數(shù)

    多個(gè)命令行參數(shù)之間用空格分隔,但是如果參數(shù)本身帶有空格,那么傳遞參數(shù)的時(shí)候應(yīng)把參數(shù)放置在雙引號(hào) "" 或單引號(hào) '' 內(nèi)部。讓我們重新編寫(xiě)上
    的頭像 發(fā)表于 11-12 14:49 ?3589次閱讀

    mini shell命令行調(diào)試工具(單片機(jī)、c語(yǔ)言

    @mini shell命令行調(diào)試工具介紹Mini shell 命令行調(diào)試工具(單片機(jī)、c語(yǔ)言)Mini shell是一個(gè)特別適合低內(nèi)存的單片機(jī)上使用的一個(gè)
    發(fā)表于 11-29 10:21 ?10次下載
    mini shell<b class='flag-5'>命令行</b>調(diào)試工具(單片機(jī)、<b class='flag-5'>c</b><b class='flag-5'>語(yǔ)言</b>)

    uvm命令行傳遞參數(shù)的小技巧

    當(dāng)我們?cè)趧?chuàng)建動(dòng)態(tài)仿真case時(shí),使用命令行參數(shù)可以非常方便地控制DUT和TB的行為,比如配置寄存器、控制激勵(lì)的發(fā)送數(shù)量、打開(kāi)或關(guān)閉某些scoreboard等。
    的頭像 發(fā)表于 08-19 11:53 ?6418次閱讀

    簡(jiǎn)述C語(yǔ)言中指針重點(diǎn)

    C語(yǔ)言中一個(gè)函數(shù)可以返回一個(gè)整型值、字符值、實(shí)型值等,也可以返回指針型的數(shù)據(jù),即地址,其概念與以前類(lèi)似,只是返回的值的類(lèi)型是指針類(lèi)型。
    的頭像 發(fā)表于 03-10 15:28 ?802次閱讀

    eclipse怎么使用命令行

    命令行中使用Eclipse來(lái)完成一些特定的任務(wù)。本文將詳細(xì)介紹如何在命令行中使用Eclipse。 首先,我們需要確保已經(jīng)正確安裝了JDK(Java Development Kit)和Eclipse
    的頭像 發(fā)表于 12-06 11:26 ?3616次閱讀

    idea如何輸入命令行參數(shù)

    。 在大多數(shù)編程語(yǔ)言中,都提供了內(nèi)置的機(jī)制來(lái)處理命令行參數(shù),以便程序可以根據(jù)用戶的需求進(jìn)行不同的操作。下面我們將逐步介紹如何在常見(jiàn)的編程語(yǔ)言中輸入
    的頭像 發(fā)表于 12-06 15:01 ?1618次閱讀
    主站蜘蛛池模板: 午夜欧美精品久久久久久久久 | 国产精品毛片在线大全 | 无遮挡很爽很污很黄在线网站 | 日日日日人人人夜夜夜2017 | 亚洲一区二区三区不卡视频 | 高清欧美色欧美综合网站 | 欧美18同性gay视频 | 老色皮| 国产成人午夜片在线观看 | 成人在色线视频在线观看免费大全 | 亚洲产国偷v产偷v自拍色戒 | 亚洲国产综合久久精品 | 色多多视频成人影院 | 色噜噜狠狠狠狠色综合久一 | 韩国三级床戏合集 | 欧美成人午夜精品一区二区 | 手机看片久久青草福利盒子 | 大桥未久加勒比女热大陆在线 | 午夜免费毛片 | 国产片91人成在线观看 | 91极品视频在线观看 | 日韩欧免费一区二区三区 | 色老头永久免费网站 | 美女自熨出白浆视频在线播放 | 在线天堂中文www官网 | 一区二区三区高清在线 | 久久久午夜精品理论片 | 久久女人网 | 国产理论视频在线观看 | 国产亚洲精品久久yy5099 | 国产全部理论片线观看 | 久久久黄色片 | 一二三区在线视频 | 欧美性色综合网 | 四虎在线观看 | 久久夜色tv网站 | www.97色| 美女无遮挡拍拍拍免费视频 | vip影视免费观看 | 日本激情网 | 91美女啪啪 |