C++ 指針/數(shù)組

C++ 指針/數(shù)組

本篇主要記錄一下之前工程中遇到的關(guān)于數(shù)組和指針問題,本篇主要有一下幾個重點
1. 指針
2. 數(shù)組和指針的區(qū)別,以及數(shù)組作為參數(shù)傳遞時的問題
3. 字符數(shù)組和string

指針

首先看看下面的代碼

int testPoint()
{
    int i[] = {100, 200, 300, 400, 500};
    int *p = i;

    printf("*p = %d\n", *p);
    printf("...%d\n", (*p)++);
    printf("*p = %d\n", *p);

    printf("...%d\n", *p++);
    printf("*p = %d\n", *p);

    printf("...%d\n", *++p);
    printf("*p = %d\n", *p);

    printf("...%d\n", ++*p);
    printf("*p = %d\n", *p);

    *p++;
    *p++;
    printf("*p = %d\n", *p);
    *p++;
    printf("*p = %d\n", *p); //出界限

    return 0;
}

上面的輸出能完全的理出來嗎?
結(jié)果我就不展示的容诬,可以拷貝了自己驗證一下結(jié)果。這就是指針的一些操作

再看看下面的代碼

void testInt()
{
    int i = -10;
    int *p = &i;
    cout << i << " " << ~i << " " << sizeof(i) << " " << sizeof(p) << " " << sizeof(*p) << endl;
    p = new int[10];
    cout << sizeof(p) << " " << sizeof(*p) << " " << sizeof(&p) << "  " << p[0] << endl;
}

上面的結(jié)果了?輸出如下

-10 9 4 8 4
8 4 8  12391472
  • 先分析第一行的輸出
  • -10取反為什么是9? 以及-10二進制表現(xiàn)形式是怎么樣的杨凑,這個涉及到原碼、補碼和反碼摆昧,可以自己去了解了解
  • i是int型的撩满,所以對應(yīng)長度就是4個Byte
  • p是指針,本質(zhì)就是一個地址,而地址其實就是一個數(shù)字绅你,而其長度應(yīng)該根據(jù)系統(tǒng)使用的地址長度了伺帘,我的是64位,就是8個Byte
  • *p就不用說了忌锯,解運算伪嫁,代表其實就是i
  • 第二行

指針這會兒指向了一個數(shù)字,看結(jié)果沒有發(fā)生變化偶垮,說明指針不管指向什么张咳,除了具體的地址值,是不會影響指針本身的特性的

指針一個重要的示例

long *fellow;
*fellow = 2333;

上面的代碼有問題似舵?為什么
上述代碼是錯誤的脚猾,因為指針申明后,他本身是沒有意義的砚哗,必須要讓他指向一個地址龙助,上述代碼,是很嚴重的bug, 等于給一個未知的地址賦值

指針和數(shù)組

之前在學校學的時候蛛芥,把指針和數(shù)組混為一談提鸟,其實誤導了很多,數(shù)組和指針還是有去別的
先看下面的示例仅淑,對輸出結(jié)果有數(shù)嗎称勋?

void testStr()
{
    char num[] = "TESTS";
    char *p = num;

    cout << sizeof(num) << " " << sizeof(*num) << " " << sizeof(&num) << " " << sizeof(char) << " " << strlen(num) << "  " << num[0] << endl;
    cout << sizeof(p) << " " << sizeof(*p) << " " << sizeof(&p) << " " << sizeof(char) << " " << strlen(p) << "  " << p[0] << endl;
}

看結(jié)果

6 1 8 1 5  T
8 1 8 1 5  T

發(fā)現(xiàn)什么了?區(qū)別就在sizeof()去取大小的時候漓糙,數(shù)組和指針是不一樣的铣缠,指針大小前面已經(jīng)提到了,而數(shù)組就是數(shù)組自身的長度昆禽。

這里還涉及到一個字符數(shù)組的問題,你會發(fā)現(xiàn),我們聲明的一個字符串,是五個字符,而字符數(shù)組居然長度是6,這是因為,字符數(shù)組需要一位'\0'來標識結(jié)束.

  • 做形參問題
void main(){
    char num[] = "TESTS";
    char *p = num;
    testStr1(num);
    testStr2(p);
}

void testStr1(char num[])
{
    cout << sizeof(num) << " " << sizeof(*num) << " " << sizeof(&num) << " " << sizeof(char) << " " << strlen(num) << "  " << num[0] << endl;
}

void testStr2(char *p)
{
    cout << sizeof(p) << " " << sizeof(*p) << " " << sizeof(&p) << " " << sizeof(char) << " " << strlen(p) << "  " << p[0] << endl;
}

來猜猜上面的結(jié)果

8 1 8 1 5  T
8 1 8 1 5  T

這兩個居然輸出一摸一樣了!
這是因為,數(shù)組做形參的時候,直接退化成了一個指針,而且你會發(fā)現(xiàn),編譯的時候,其實也會有錯誤提示提醒你改成指針.

datatype.cpp: In function 'void testStr1(char*)':
datatype.cpp:83:20: warning: 'sizeof' on array function parameter 'num' will return size of 'char*' [-Wsizeof-array-argument]
  cout << sizeof(num) << " " << sizeof(*num) << " " << sizeof(&num) << " " << sizeof(char) << " " << strlen(num) << "  " << num[0] << endl;
                    ^
datatype.cpp:81:24: note: declared here
 void testStr1(char num[])

注意

對于字符串比較特殊,其長度可以通過結(jié)束標識來計算出來,所以正常情況下,我們傳數(shù)組指針的時候,還需要額外的形參去標識一個數(shù)組的長度

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蝗蛙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子醉鳖,更是在濱河造成了極大的恐慌捡硅,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盗棵,死亡現(xiàn)場離奇詭異壮韭,居然都是意外死亡北发,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門喷屋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來琳拨,“玉大人,你說我怎么就攤上這事屯曹∮樱” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵恶耽,是天一觀的道長密任。 經(jīng)常有香客問我,道長偷俭,這世上最難降的妖魔是什么浪讳? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮涌萤,結(jié)果婚禮上淹遵,老公的妹妹穿的比我還像新娘。我一直安慰自己形葬,他們只是感情好合呐,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著笙以,像睡著了一般淌实。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上猖腕,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天拆祈,我揣著相機與錄音,去河邊找鬼倘感。 笑死放坏,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的老玛。 我是一名探鬼主播淤年,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蜡豹!你這毒婦竟也來了麸粮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤镜廉,失蹤者是張志新(化名)和其女友劉穎弄诲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娇唯,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡齐遵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年寂玲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梗摇。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拓哟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出留美,到底是詐尸還是另有隱情彰檬,我是刑警寧澤伸刃,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布谎砾,位于F島的核電站,受9級特大地震影響捧颅,放射性物質(zhì)發(fā)生泄漏景图。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一碉哑、第九天 我趴在偏房一處隱蔽的房頂上張望挚币。 院中可真熱鬧,春花似錦扣典、人聲如沸妆毕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笛粘。三九已至,卻和暖如春湿硝,著一層夾襖步出監(jiān)牢的瞬間薪前,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工关斜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留示括,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓痢畜,卻偏偏與公主長得像垛膝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子丁稀,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容