C語言你必須知道的

前言

C語言學(xué)過了, 認(rèn)真思考過嗎?幾個栗子, 或許讓你得到一些裝逼技能。

example

    int a[5] = {1, 2, 3, 4, 5};
    
    printf("%d\n", 0[a]);
    
    printf("%d\n", *a);

說明

a[0] = *a = *(a + 0) = *(0 + a) = 0[a]
然而這種寫法很少見, 但是可以用。比如: 1[a]用來訪問數(shù)值中下標(biāo)為1的元素

example

     int a[5] = {1, 2, 3, 4, 5};
    
    printf("%p\n", a);
    printf("%p\n", &a);
    
    int (*p)[5] = &a;
    p++;
    
    int *q = (int *)p;
    q--;
    
    printf("%d\n", *q);

輸出

0x7fff5fbff7f0

0x7fff5fbff7f0

5

說明

a是數(shù)組首個元素的地址和&a[0]等價。 雖然他們的值都和&a一樣, 但是意義是不一樣的, &a是整個數(shù)組的首字節(jié)地址。感覺沒區(qū)別, 但是上面的例子會讓你理解, 因為他們類型, 不一樣+1的時候步長也不一樣。a是int *類型的, 而&a是 int(*)[5]類型的。在尋找時候起點相同邁出的步子不同肯定結(jié)果就不同了。結(jié)果就是先跑到了數(shù)組的最后, 然后回來一個步長, 自然也就是5了。

example

    char *str = "Hello, world";
    
    printf("%s\n", str);
    
    printf("%s\n", "Hello");
  
    printf("%c\n", *"world");
    
    printf("%c\n", "Hello"[0]);
    
    printf("%c\n", 0["Hello"]);
    
    
    printf("%c\n", 1["Hello"]);
    
    printf("%c\n", *("Hello" + 1));

輸出

Hello, world 
Hello
w
H
H
e
e

說明

這個初學(xué)者可能很難理解吧, 因為對字符串的存儲不理解。字符串在只讀數(shù)據(jù)段, 在棧段只保存著它的首個字符地址, 這樣就很方便的找到它了。 難道第一行中char *str = "Hello, world", 你不覺得str是一個指針嗎?(指針是什么?指針就是一個變量, 只是用來保存地址而已)那么"Hello, world"就是一個地址, 一個字符一個字節(jié)保存哪一個字節(jié)的地址呢?當(dāng)然保存首個元素的地址。還值得一提的是字符數(shù)組保存在棧段, 所以可以被修改, 但是只讀數(shù)據(jù)段, 是不能改的。如果改了就.....下圖

通過地址修改只讀數(shù)據(jù)段內(nèi)容

example

你認(rèn)識下面的p是什么嗎?

  • int p[10]

  • int *p[10]

  • int (*p[10])(int, int)

  • int (*p)(int, int)

  • int (*p[10])(int, int);

int p[10]

這是一個數(shù)組

int *p[10]

這是一個指針, 指向什么呢? 去掉*就是指向的東西, int [10], int [10]是一個什么呢? int a[10]這是一個數(shù)組。所以p是一個數(shù)組, 數(shù)組的每一個元素都是指針。

  • int (*p[10])(int, int)

有了上面的基礎(chǔ)那就很好解釋了。p是一個數(shù)組, 每一個元素都是一個指針, 每個指針指向一個函數(shù)(int a(int, int)), 函數(shù)是輸入為兩個int, 返回值是int類型。

  • int (*p)(int, int)

p是一個指針, 指向一個返回值是int的函數(shù), 這個函數(shù)就是int (int, int)

example

終端原始環(huán)境下運行

#include <stdio.h>
#include <unistd.h>

int main(){


        while(1){
                sleep(1);
                printf("Hello, world");
        }

        return 0;
}   

現(xiàn)象

什么都沒有出現(xiàn), 但是把sleep改為usleep就會打印。

原因是數(shù)據(jù)緩沖區(qū)滿了, 或者 \n 沖刷函數(shù)就會輸出到屏幕上。
如果你還不知道, 再學(xué)學(xué)吧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu); ...
    朱森閱讀 3,615評論 3 44
  • 1.語言中變量的實質(zhì) 要理解C指針,我認(rèn)為一定要理解C中“變量”的存儲實質(zhì), 所以我就從“變量”這個東西開始講起吧...
    金巴多閱讀 1,978評論 0 9
  • 計算機二級C語言上機題庫(南開版) 1.m個人的成績存放在score數(shù)組中,請編寫函數(shù)fun,它的功能是:將低于平...
    MrSunbeam閱讀 6,617評論 1 42
  • 昨晚躺下后,翻來覆去,不知是午睡太久,還是娃外出的緣故? 今晚一個人在家,拖了地,邊看夏令營群,邊懂你,一心兩用,...
    小空同學(xué)閱讀 163評論 0 2
  • 坐在學(xué)校東門的廣場上,聽著悲傷的歌曲,心中的憂傷陡然劇增,淚水在眼中打轉(zhuǎn)。 看著來來往往的人群,回想剛才對男朋...
    Laleo閱讀 636評論 2 1

友情鏈接更多精彩內(nèi)容