3
2位機
int *p = NULL;
sizeof(p)的值是多少? 4
sizeof(*p)呢? 4
這裡需要理解一下數組首地址和數組元素首地址。
&a,&a[0],a,雖然這兩個地址是一樣的,但是含義確實不一樣的。我們從底下的&a+1和&a[0]+1上就看出區別來了,前者代表的意思是:&a[0]+sizeof(int)*100,也就是說指向了下一個有100個int元素的數組的首地址。我們可以做個實驗來驗證一下:
int b[100],a[100];
printf("%x,%x/n",(&a+1),b);
地址應該是一樣的。注意一下,在VC6下先聲明的變數處在記憶體的高地址,後聲明的變數處在地址低位。所以a的地址低,而b的地址高。
a的地址是和&a[0]的地址一樣的,也就是說a代表的是數組首元素的地址,而&a代表的是數組的首地址雖然他們的值都是一樣的吧。一定要分清楚這三個的區別!!
然後在理解下面的例子就應該容易點了。
int a[100];
sizeof (a) 的值是多少? 400
sizeof(a[100])呢?//請尤其注意本例。 4
sizeof(&a)呢? 400
sizeof(&a[0])呢? 4
int b[100];
void fun(int b[100])
{
sizeof(b);// sizeof (b) 的值是多少? 4
sizeof(b[100]); 4
sizeof(&b); 4
sizeof(&b[0]); 4
}
int aa[5]={1,2,3,4,5};
int *ptr1=(int*)(&aa+1);
int *ptr2=(int*)((int)aa+1);
printf("%x,%x,%x/n",aa+1,(int)aa+1,&aa+1);
printf("%x,%d/n",ptr1[-1],*ptr2);
這裡需要注意的就是aa+1,&aa+1,(int)aa+1,分別表示從aa[0]的地址,分別+4個位元組,+整個數組的長度,+1個位元組。
可以這樣理解:因為aa是指向數組首元素的地址,也就是說aa的類型是int,所以aa+1就相當於aa+sizeof(int)*1,而&aa指向的是數組的首地址,那麼它的類型是int [5],所以&aa+1就相當於aa+sizeof(int[5])*1,而(int)aa+1就是把aa首元素的地址轉換成int型後+1,如果aa首元素的地址為0x100000,那麼(int)aa+1就等於0x1000000+1=0x1000001,這樣解釋就明白多了!
可以自己看一下第二行列印語句列印的是什嗎?
=======================================================
檢查大端小端的函數:
返回1為小端,返回0為大端
int checkSystem( )
{
union check
{
int i;
char ch;
} c;
c.i = 1;
return (c.ch ==1);
}
或者
int xx = 1;
if(*(char *)&xx == 1)
printf("little-endian/n");
else
printf("big-endian/n");
======================================================
柔性數組(C99):
typedef struct st_type
{
int i;
int a[0];
}type_a;
或者
typedef struct st_type
{
int i;
int a[];
}type_a;
type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));
注意sizeof(type_a);
========================================================
const修飾符:
先忽略類型名(編譯器解析的時候也是忽略類型名),我們看const 離哪個近。“近水樓
台先得月”,離誰近就修飾誰。
const int *p; //const 修飾*p,p 是指標,*p 是指標指向的對象,不可變
int const *p; //const修飾*p,p 是指標,*p 是指標指向的對象,不可變
int *const p; //const修飾p,p 不可變,p 指向的對象可變
const int *const p; //前一個const 修飾*p,後一個const 修飾p,指標p 和p 指向的對象
都不可變
=========================================================
無符號整形變數
1),int i = -20;
unsigned j = 10;
j+=i;
printf("%u/n",j); //4294967286
的值為多少?為什嗎?
2), 下面的代碼有什麼問題?(無限迴圈)
unsigned i ;
for (i=9;i>=0;i--)
{
printf("%u/n",i); //無限迴圈
}