c語言的指標和陣列始終是我們的軟肋,這裡我也想記錄下自己的學習情況。首先說說sizeof的在指標裡的用法:
array是陣列指標,sizeof(array)返回指標指向的記憶體空間的長度
sizeof(int)是每個int型別佔的記憶體空間
sizeof(array)/size(int)就是求出array裡有多少個int型別資料,也就是陣列的長度
#include int main(void),,},,,}};
int (*p)[3][5] =apricot;
int (*r)[5] = apricot[0
];
int *t = apricot[0][0
];
printf(
"the addr of apricot is 0x%0x\n
", apricot);//
printf("
size of the apricot in int= %d\n
",(sizeof(apricot)/sizeof(int
)));
printf(
"size of the apricot in byte = %d\n
",(sizeof
(apricot)));
printf(
"the value of the apricot[0][0] = 0x%0x\n
",apricot[0][0
]); printf(
"the addr of the apricot[0][0] = 0x%0x\n
",&(apricot[0][0
]));
printf(
"the value of the apricot[0] = 0x%0x\n
",apricot[0
]); printf(
"the addr of the apricot[0] = 0x%0x\n\n
",&(apricot[0
]));
printf(
"the addr of r is 0x%0x\n
", r);//
列印r的位址
printf("
the value of *r is %d\n
", (*r++)[0]);//
列印之前r位址裡的值,之後r++,指向有乙個元素
printf("
the addr of r++ is 0x%0x\n
", r);//
列印r++之後的位址。
printf("
the value of *r++ is %d\n
", (*r)[0]);//
列印r++之後的位址裡的值
printf("
the value of (*r)[1] is %d\n\n
", (*r)[1]);//
列印後乙個元素的值
printf(
"the addr of t is 0x%0x\n
", t);//
列印t的位址
printf("
the value of *t is %d\n
", (*t++));
/*列印之前t位址裡的值,之後t++,指向有乙個元素,此時t的位址為0x22fedc+4 = 0x22fee0
*/printf(
"the addr of t++ is 0x%0x\n
", t);//
列印:0x22fee0
printf("
the value of *t++ is %d\n
", (*t));//
列印0x22fee0位址裡的值
printf("
the value of (*++t) is %d\n\n
", (*++t));//
列印0x22fee0+4位址裡的值
printf(
"the addr of p is 0x%0x\n
", p++);
printf(
"the addr of *p is 0x%0x\n\n
", *p);//
其差值是60=15(3*5)*4
return0;
}
apricot是陣列名,也是第乙個元素的位址,sizeof(apricot)返回此位址以後的指向的記憶體空間的長度以下是我在windows下用gcc編譯執行的結果:
size of the apricot in int= 30sizeof(int)是每個int型別佔的記憶體空間,在x86裡佔4個位元組。size of the apricot in byte = 120
the value of the apricot[0][0] = 0x22fedc
the addr of the apricot[0][0] = 0x22fedc
the value of the apricot[0] = 0x22fedc
the addr of the apricot[0] = 0x22fedc
the addr of r is 0x22fedc
the value of *r is 1
the addr of r++ is 0x22fef0
the value of *r++ is 6
the value of (*r)[1] is 5
the addr of t is 0x22fedc
the value of *t is 1
the addr of t++ is 0x22fee0
the value of *t++ is 2
the value of (*++t) is 3
the addr of p is 0x22fedc
the addr of *p is 0x22ff18
在本例程中,共有2*3*5個陣列元素,30個int元素。如果用位元組顯示的話,就是4*30=120個位元組,
the addr of r is 0x22fedc
the addr of r++ is 0x22fef0
the addr of t++ is 0x22fee0
t本身是乙個指標,它指向apricot[0][0]記憶體所儲存的陣列內容,t自增1就是t的值+4(int),於是t就指向下乙個元素。這也就是
the value of *t++ is 2
the value of (*++t) is 3
所表達的意義。
還有一點apricot[0]和apricot[0][0]是乙個常量,自增或自減都是非法的,(也就是說,指標是可以自增自減的,而陣列名是個常量,不可以改變的。)
編譯會有這樣的而結果:
triarray.c:30: error: lvalue required as increment operand
有啥說的不妥的地方歡迎指正!!~~~謝謝!(*^__^*)
c語言中的sizeof
一 sizeof的概念 sizeof是c語言的一種單目操作符,如c語言的其他操作符 等。它並不是函式。sizeof操作符以位元組形式給出了其運算元的儲存大小。運算元可以是乙個表示式或括在括號內的型別名。運算元的儲存大小由運算元的型別決定。二 sizeof的使用方法 1 用於資料型別 sizeof使用...
C語言中的sizeof
一 sizeof是編譯器的內建指示符 不是函式 sizeof用於計算型別或變數所佔的記憶體大小 sizeof的值在編譯期就已經確定 sizeof用於型別 sizeof type sizeof用於變數 sizeof var 或 sizeof var int var 0 printf d n sizeo...
c語言中的sizeof
首先,sizeof是c語言的一種單目操作符,以位元組的形式給出了其運算元的儲存大小,其返回值為size t,在64位機器下被定義為long unsigned int。sizeof測的大小,在不同的機器上可能不一樣,sizeof不能傳函式。1.基本資料型別 include include intmai...