C語言學習筆記(一)——數組指標雜項

來源:互聯網
上載者:User

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);                 //無限迴圈
}

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.