c指標 2個疑惑。

2021-06-16 22:02:42 字數 1475 閱讀 6367

先註明,寫給自己看的。

1.

#include #include int main()

ptr++;

printf("%d ",*ptr);

return 0;

}

剛剛看這樣的題目,感覺蠻簡單的。

ptr定義指向了 m_array的首位址,  char型別1位元組。

乙個int4個位元組  ptr++後, 指標ptr的值加上1乘sizeof(int),在32位程式中就是加上了1乘4=4個位元組。

所以現在ptr其實是指向m_array[4], 按照這樣的輔助,列印應該是4.

可是列印結果是134678021

頓時傻眼了。

不斷的思考,google,還是沒搞懂。   最後,在群裡詢問,終於,貌似弄懂了....

試著用printf("%x  ",*ptr);列印,就能知道錯在哪了。  

現在的列印結果是08070605

這樣的結果,讓我重新思考了。

%x是16進製制輸出。

現在陣列裡面的資料是 1 2 3 4 5 6 7 8 。。。。。。

即ptr的指標指向的區域是前面4個char。就是0x04030201

ptr++指向下乙個int區域,就是就是0x08070605

也就是,ptr這個指向int型別資料的指標,*ptr表示指標所指空間儲存資料,是int型,佔四個位元組。   而不是單純的利用m_array[4]表示。(陣列為char,m_array[4]僅佔乙個位元組)。

這樣解釋,貌似能說通了。     先留個記錄,便於以後回顧。

2.從網路上看到這樣一道有意思的題目,是關於陣列與指標的問題,描述如下:

main()

; int *ptr=(int *)(&a+1);

printf("%d,%d",*(a+1),*(ptr-1));

}

輸出為:2,5

請解釋以上**的輸出結果。

答案如下:

*(a+1)其實很簡單就是指a[1],輸出為2.

問題關鍵就在於第二個點,*(ptr-1)輸出為多少?

解釋如下,&a+1不是首位址+1,系統會認為加了乙個整個a陣列,偏移了整個陣列a的大小(也就是5個int的大小)。所以int *ptr=(int *)(&a+1);其實ptr實際是&(a[5]),也就是a+5.

原因為何呢?

&a是陣列指標,其型別為int(*)[5];

而指標加1要根據指標型別加上一定的值,不同型別的指標+1之後增加的大小不同,a是長度為5的int陣列指標,所以要加5*sizeof(int),所以ptr實際是a[5],但是ptr與(&a+1)型別是不一樣的,這點非常重要,所以ptr-1只會減去sizeof(int*),a,&a的位址是一樣的,但意思就不一樣了,a是陣列首位址,也就是a[0]的位址,&a是物件(陣列)首位址,a+1是陣列下一元素的位址,即a[1],&a+1是下乙個物件的位址,即a[5]。

C指標兩個疑惑

1.cpp view plain copy include include intmain ptr printf d ptr return 0 剛剛看這樣的題目,感覺蠻簡單的。ptr定義指向了 m array的首位址,char型別1位元組。乙個int4個位元組 ptr 後,指標ptr的值加上1乘si...

C的指標疑惑 C和指標13 高階指標話題 上

int f f為乙個函式,返回值型別是乙個指向整形的指標。int f 兩對括號,第二對括號是函式呼叫操作符,但第一對括號只起到聚組的作用。f為乙個函式指標,它所指向的函式返回乙個整型值。int f f是乙個函式指標,指向的函式返回值是乙個整形指標。int f 下標的優先順序更高,所以f是乙個陣列,元...

指標使用的疑惑

test1.c include include include include char b abcdefg void change char char str int main int argc,char argv gcc test1.c o test1 執行結果 str abcdefg a nu...