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

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

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

3天內不再提示

C語言中指針的命令行參數

C語言編程學習基地 ? 來源:C語言編程學習基地 ? 作者:C語言編程學習基地 ? 2022-09-26 10:18 ? 次閱讀

指針是C語言最重要也是最難理解的部分,它在我們平時的工作中無處不在。

今天我們繼續來看看指針的剩下的知識總結吧!上一批的話可以在主頁看到哦~

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

5 指針與結構體

一個指針,它指向的可以是一個結構體類型,這稱為結構體指針。而一個結構體,它的成員中也可以有指針成員。

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

上面的代碼中,定義了一個結構體變量stu1。這個變量中有一個指針變量name。還定義了一個結構體指針pstu。

我們想要通過結構體指針訪問結構體成員一般有以下兩種方式:

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

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

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

char* const ptr = "just a string";

類似的,我們也可以分析下面的代碼:

// 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): 它的本質是一個常量,只不過這個常量是指針。由于指針是只可讀不可修改的,所以這個指針不能指向別的地址了,但是該地址里的內容還是可以改變的。指針常量的聲明格式如下:

 * const 例如: int * const ptr;

我們來看下序:

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

上面這段程序中:

我們首先定義了兩個變量var1,var2;

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

接著,試圖讓ptr指向var2

最后,打印出指針ptr指向的地址的內容

讓我們來運行一下這個程序:

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

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

但是我們還是可以修改指向的地址里的內容的:

#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):它的本質是一個指針,只不過它指向的值是常量(只可讀,不可修改)。由于指向的是一個只可讀不修改的值,所以指針不能通過它存儲的地址間接修改這個地址的值,但是這個指針可以指向別的變量。

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

const * 例如: const int* ptr;

還是有一段程序:

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

我們還是來分析一下這個程序:

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

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

接著,試圖通過指針ptr來改變var1的值

最后,打印出ptr指向的地址的內容。

我們進行編譯:

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

編譯報錯也很明顯: *ptr是一個只讀的。所以不能通過ptr來修改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 指向常量的常量指針

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

它的聲明格式如下:

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

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

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

編譯結果:

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 指針與函數

7.1 函數指針

指針與函數相結合有兩種情況:指針函數、函數指針。

指針函數,它的本質是一個函數,它的返回值是一個指針。

int * func(int x, int y);

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

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

輸出:

0000000000401550

而函數指針,它的本質是一個指針。只不過它存的地址恰好是一個函數的地址罷了。

函數指針變量定義的格式一般是:

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

比如:

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

輸出:

00000000004015500000000000401550

可以發現,兩者地址相等。

函數指針類型的定義:

typedef  返回值 (* 類型名)(參數列表);復制代碼

比如:

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

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

#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 回調函數

說到函數指針,那還有一個概念不得不提——回調函數。因為在實際的項目代碼中實在是太常見了。

回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。

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

怎么使用回調函數:

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

如上述代碼:可以看到,Handle()函數里面的參數是一個指針,在main()函數里調用Handle()函數的時候,給它傳入了函數Callback_1()/Callback_2()/Callback_3()的函數名,這時候的函數名就是對應函數的指針,也就是說,回調函數其實就是函數指針的一種用法。

8 二維指針

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

#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

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

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

8.1 命令行參數

處理命令行參數是指向指針的指針的一個用武之地。

一般main函數具有兩個形參。第一個通常稱為argc,它表示命令行參數的數目。第2個通常稱為argv,它指向一組參數值。由于參數的數目并沒有內在的限制,所以argv指向這組參數值(從本質上來說是一個數組)的第一個元素。這些元素的每個都是指向一個參數文本的指針。如果程序需要訪問命令行參數,main函數在聲明時就要加上這些參數。

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

舉例:

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

在windows上執行: est2.exe hello world

argc: 3helloworld

注意,如果命令行中傳遞的一個參數包括空格,就需要用 ""將參數括起來,比如:

. est2.exe "hello word"

則上面的代碼將輸出:

argc: 2hello word

9 結束語

本文關于指針的講解就結束了。我相信你一定對指針有更深入的了解。

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

    關注

    180

    文章

    7618

    瀏覽量

    138660
  • 函數
    +關注

    關注

    3

    文章

    4353

    瀏覽量

    63295
  • 指針
    +關注

    關注

    1

    文章

    483

    瀏覽量

    70706

原文標題:C語言基礎知識:最核心的—指針!知識總結(第二部分)

文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C語言中指針的定義

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

    C語言中指針函數和函數指針的概念及應用示例

    C語言中,指針函數和函數指針是強大且常用的工具。它們允許我們以更靈活的方式處理函數和數據,進而擴展程序的功能。
    發表于 08-16 16:14 ?1292次閱讀

    C語言中指針的基本概念和用法

    C語言中指針是一項重要的概念,它允許我們直接訪問和操作內存地址。
    發表于 08-17 15:30 ?913次閱讀

    談談C語言中指針有什么好處,請各位高手們談談自己的體會

    談談C語言中指針有什么好處,請各位高手們談談自己的體會...
    發表于 09-01 17:38

    C語言入門教程-命令行參數

    命令行參數C中,獲取用戶輸入的命令行參數是很方便的。程序的主函數會接受一個argv參數。有
    發表于 07-29 14:22 ?2632次閱讀

    caxa命令行中的應用

    caxa命令行中的應用 命令行對于大多用戶來說往往只是輸入數據的作用,但是其中的奧妙還有很多,下面就給大家
    發表于 10-18 18:18 ?2341次閱讀

    C語言中指針的介紹非常詳細

    C語言中指針的介紹非常詳細 C語言中指針的介紹非常詳細
    發表于 12-25 10:39 ?57次下載

    CMD的命令行高級教程

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

    基于C語言中指針的基本用法解析

    C語言中其它的知識都學得可以,唯獨指針搞不懂。如果是這樣,我可以很負責的告訴你,對于這門編程語言,你等于是沒學。所以學好指針對于初學者是非
    的頭像 發表于 01-09 15:12 ?4882次閱讀

    C語言中一個簡單的實例,檢查命令行是否有提供參數

    多個命令行參數之間用空格分隔,但是如果參數本身帶有空格,那么傳遞參數的時候應把參數放置在雙引號 "" 或單引號 '' 內部。讓我們重新編寫上
    的頭像 發表于 11-12 14:49 ?3499次閱讀

    mini shell命令行調試工具(單片機、c語言

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

    uvm命令行傳遞參數的小技巧

    當我們在創建動態仿真case時,使用命令行參數可以非常方便地控制DUT和TB的行為,比如配置寄存器、控制激勵的發送數量、打開或關閉某些scoreboard等。
    的頭像 發表于 08-19 11:53 ?5935次閱讀

    簡述C語言中指針重點

    C語言中一個函數可以返回一個整型值、字符值、實型值等,也可以返回指針型的數據,即地址,其概念與以前類似,只是返回的值的類型是指針類型。
    的頭像 發表于 03-10 15:28 ?689次閱讀

    eclipse怎么使用命令行

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

    idea如何輸入命令行參數

    。 在大多數編程語言中,都提供了內置的機制來處理命令行參數,以便程序可以根據用戶的需求進行不同的操作。下面我們將逐步介紹如何在常見的編程語言中輸入
    的頭像 發表于 12-06 15:01 ?1364次閱讀
    主站蜘蛛池模板: 一一本之道高清手机在线观看 | 91香蕉福利一区二区三区 | 青青草国产精品 | 精品国产自在现线拍400部 | 国产手机在线视频 | 精品日韩欧美一区二区三区 | 18国产精品白浆在线观看免费 | 久久99亚洲AV无码四区碰碰 | 午夜毛片在线观看 | 欧美精品久久久久久久久大尺度 | 处女座历史名人 | 国产AV国产精品国产三级在线L | 蜜桃无码AV视频在线观看 | bl肉yin荡受np各种play | 乱奷XXXXXHD| 亚洲黄色高清视频 | 美女张开腿露出尿口扒开来摸动漫 | 世界上第一个得抑郁症的人是谁 | 久久亚洲精品无码A片大香大香 | 2019午夜福利757视频第12集 | 高h肉文np| 老师扒开尿口男生摸尿口 | 蜜柚在线观看免费高清官网视频 | 真实农村女人野外自拍照片 | 精品国产自在现线拍国语 | 9亚洲欧洲免费无码在线 | 轻轻cao | 在线视频a| 国产露脸150部国语对白 | 国产自产第一区c国产 | 在线 | 果冻国产传媒61国产免费 | 天天夜夜草草久久亚洲香蕉 | 久久精品国产亚洲AV妓女不卡 | 午夜天堂AV久久久噜噜噜 | 色人阁综合 | 中国老头oldday tv | 亚洲最大成人 | 欲香欲色天天天综合和网 | 曰韩一本道高清无码av | 国产乱码伦人偷精品视频 | 毛片基地看看成人免费 |