前天看到一同事在研究指針世舰,當下好奇,就過去看了一眼槽卫,用來測試的代碼是這樣子的
例子1
int TestDatas[5] = { 0, 1, 2, 3, 4 };
printf("%8p\r\n", &TestDatas);
printf("%8p\r\n", &TestDatas + 1);
printf("%8p\r\n", *(&TestDatas + 1));
printf("%8p\r\n", *(&TestDatas + 1) - 1);
printf("%d\r\n", *(*(&TestDatas + 1) - 1));
然后他問我跟压,你知道每句輸出是什么嗎?我心中鄙視歼培,當然知道了震蒋,其結果不言而喻,我錯的很離譜躲庄,因當時在忙查剖,只能暫記心中,直到現(xiàn)在才有功夫來搭理它噪窘。
這小段代碼笋庄,其實是有問題的,先不管他是對是錯倔监,我們一行一行的來分析它直砂。
printf("%8p\r\n", &TestDatas);
&TestDatas 這個表明是取TestDatas這個數(shù)組的地址的,沒什么疑問浩习,主要是看下面這兩句
printf("%8p\r\n", &TestDatas + 1);
printf("%8p\r\n", *(&TestDatas + 1));
而我們出錯就容易錯在這兩句話上静暂,如果有些同學不小心,肯定以為這兩句打印出來就是首地址+1sizeof(int)谱秽,那這樣就錯了洽蛀,請看下圖
為什么呢摹迷?為什么兩個都是地址,并且地址都一樣呢郊供?打印出的第二行峡碉,我們的預期是首地址+1sizeof(int),但是為什么不是呢颂碘?我們拆開來分析一下异赫,TestDatas是地址吧,這個沒有什么疑問吧头岔,那&TestDatas就是數(shù)組地址的地址塔拳,也沒有問題吧,而數(shù)組占用的存儲空間是20個BYTE也沒有問題吧峡竣,那么+1靠抑,就是加一個數(shù)組的大小的空間,這樣就明白了适掰,為什么首地址是0x0043FDB4 +1 后就是0x0043FDC8了颂碧。
printf("%8p\r\n", *(&TestDatas + 1));
就更有迷惑性了,有些同學可能張口就說类浪,這個打印出來的是1载城,那就大錯特錯了,這個地方需要重點注意费就,仔細點诉瓦,再仔細點,不要輕敵力细,同樣的睬澡,TestDatas 是地址,&TestDatas 是地址的地址眠蚂,那數(shù)組地址+1煞聪,就是加整個數(shù)組,然后再取地址的地址逝慧,結果當然還是地址了昔脯。若是這樣寫
printf("%8p\r\n", *(TestDatas + 1));
那結果鐵定是1了。就是大部分人第一眼看到后心里想的結果了笛臣。
printf("%8p\r\n", *(&TestDatas + 1) - 1);
printf("%d\r\n", *(*(&TestDatas + 1) - 1));
這兩個就是中規(guī)中矩的了栅干,沒什么好說的取到下一個數(shù)據(jù)空間的首地址,然后再減去一個1*sizeof(int) 另外一個就是對這個地址取值了捐祠。