for(p=s+1;p < s + 4; p++)
p的初值是s+1,s是數(shù)組首元素地址,加一就是第二個(gè)元素地址,于是指針 p 指向數(shù)組第二個(gè)元素,就是B。
?printf在輸出字符串的時(shí)候,后面的參數(shù)是個(gè)地址,就是從這個(gè)地址開始向后逐個(gè)輸出,直到遇到?,于是,第一次循環(huán)結(jié)果就是BCD。接下來,是p++操作,p加一會(huì)加幾個(gè)字節(jié),主要取決于它指向的內(nèi)存是什么類型。char *p說明它指向的是char類型的數(shù)據(jù),char類型數(shù)據(jù)在內(nèi)存中占一個(gè)字節(jié),所以p+1也就加一個(gè)字節(jié),p指向了字符C,輸出CD。
?一共循環(huán)三次,所以結(jié)果就一目了然了。
BCD CD D
指針運(yùn)算需要注意它的步長(zhǎng)。
int main()
{
int num, *p = #
char ch, *q = &ch;
printf("p的值 %p
", p);
printf("p+1的值 %p
", p + 1);
printf("q的值 %p
", q);
printf("q+1的值 %p
", q + 1);
return 0;
}
比如,同樣是指針,int *和char *,它倆加一的結(jié)果就不一樣,一個(gè)加四個(gè)字節(jié),一個(gè)加一個(gè)字節(jié)。
root@Turbo:~# ./test
p的值 0x7ffc8116daf4
p+1的值 0x7ffc8116daf8
q的值 0x7ffc8116daf3
q+1的值 0x7ffc8116daf4
root@Turbo:~#
如果把它理解成指向下一個(gè)元素,我覺得可能更容易接受一些。所以在寫代碼的時(shí)候,不同類型的指針不要隨便賦值,除非你知道你在干什么,否則,就會(huì)出現(xiàn)一些不可預(yù)知的錯(cuò)誤。比如下面的代碼:
int main()
{
int num[] = {1, 2, 3, 4, 5};
char *p = (char *)num;
p++;
printf("%d
", *(int *)p);
return 0;
}
num是個(gè)整型數(shù)組,每個(gè)元素占4個(gè)字節(jié)。
但是指針p是字符型指針,對(duì)p做自增操作,每次只能移動(dòng)一個(gè)字節(jié)。很顯然,已經(jīng)不是一個(gè)完整的整數(shù)。所以這樣的賦值,盡可能避免。
審核編輯:湯梓紅
-
字符串
+關(guān)注
關(guān)注
1文章
566瀏覽量
20384 -
指針
+關(guān)注
關(guān)注
1文章
475瀏覽量
70457 -
代碼
+關(guān)注
關(guān)注
30文章
4670瀏覽量
67764 -
變量
+關(guān)注
關(guān)注
0文章
607瀏覽量
28257
原文標(biāo)題:指針作為循環(huán)變量
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論