久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

C語言數組分析

作者:公平   來源:本站原創   點擊數:  更新時間:2014年03月14日   【字體:
以前學習C語言的時候覺得數組和指針結合在一起的時候真的是地獄,很容易就搞混淆了,最近看了C語言深度解剖有了一點理解,好好的總結一下吧。其中很多的知識都是因為我們在學習的過程中沒有仔細的去分析導致的。同時我體會到了我們在寫代碼的過程中應該更多的注重代碼的調試,而不是換新的代碼,只有不斷的調試才能知道其中問題所在。

數組和指針之間本來沒有什么關系,數組就是數組,指針就是指針,之間并沒有關系,只是因為某些相似特性使得我們在分析的過程中存在較大的迷惑。

數組就是一個連續存儲空間的存儲的數值。指針就是指針,指針變量所在內存中存儲的值都是地址。

C 語言中數組的大小必須是一個常數,但是不能認為采用const限定的變量就能作為數組大小的值,在C語言中const并不是定義一個常數,只是定義了一個只讀類型的數據,并不是常數。在C語言中通常采用:
#define N  5

int Array[N];
const int M = 5;
int Array[M];//這是一種錯誤的定義方式,注意const并不是定義常量,但是C++中可以這樣定義。

在一維數組中使用下標來訪問數組,Array是整個分配存儲空間的名字,單個的存儲空間并沒有名字。這個存儲空間存儲的值為數組的元素,主要是 Array[0],Array[1],...,Array[N-1],數組元素并沒有名字。我們對數組的訪問主要是采用下標的方式進行訪問。Array與這塊存儲空間已經密切的關聯起來,不能改變。但是需要主要的是Array作為右值時,表示的是該數組首個元素(Array[0])的地址,而不是代表整個數組的地址起始地址,雖然兩個起始地址是相同的,但是需要理清其中的概念。整個數組的起始地址可以通過對這塊存儲區域取地址,也就是采用&a,這時得到的值才是整個數組的起始地址,雖然兩個值是相同的,但是需要搞清楚其中的道理。

在數組中位置的變化也是非常重要的。
int *p = NULL;
p = Array + 1;
是指在數組Array的首元素的首地址上增加一個元素的寬度,使得p指向Array[1]。因為Array表示的是數組首個元素的首地址,那么操作的最小單位就是元素,Array + 1就是訪問下一個元素。
p = &Array + 1;
由于&Array是表示數組的起始地址,操作的最小單位是一個數組,而不是元素,因此Array+1就是下一個數組的起始地址,也就是將p指向了Array的下一個數組,而不是元素。

因此需要注意一維數組名在作為右值時是表示數組首個元素的首地址,并不表示整個數組的首地址。

對于二維數組(多維數組)也存在類似的問題。

int *p = NULL;
#define N 5
#define M 5
int A[N][M];

數組A存在5個元素,每一個元素是一個數組,每個數組中存在5個元素。數組名A表示首個元素的首地址,因此A表示A[0]的首地址,A的元素為數組,A + 1表示下一個元素(小數組)也就是A[1]的首地址;&A表示整個數組的首地址。&A+1表示下一個數組的起始地址。

A作為右值時,表示數組首元素的首地址,也就是A[0]的首地址,A[i]作為右值時是表示第i個元素(也是數組)的首元素(A[i][0])的首地址。由于A表示地址,這與指針存在很多的相似性,因此可采用指針的方式進行訪問。具體的實現過程如下:
A                                                     %%第0行的元素的首地址,不是第0行第0個元素的地址
A[i]        <--->    *(A+i);                   %%第i行第0個元素的地址
A[i][j]     <--->    *(*(A+i)+j);           %%第i行第j個元素
&A[i][j]  <--->    (*(A+i)+j);             %%第i行第j個元素的地址
A[i]+j     <--->    (*(A+i)+j);             %%第i行第j個元素的地址
&A+1                                              %%下一組數組的起始地址
A+i                                                  %%第i行數組的起始地址

在多維數組中存儲方式是線性的存儲方式,可以通過指針快速的訪問。首先A表示首元素的首地址,將指針指向這個首地址就能快速的實現訪問。

為了說明這些相互關系的,采用GDB對數組進行調試:

int main()
{
        int  i = 0,j = 0;
        int a[5][5];
        int b[5]={4,5,7,8,9};
        for(;i < 5; ++i)
                for(;j<5;++j)
                        a[i][j] = (i-j)+15;
}

編譯調試:
(gdb) p a    
$1 = {{15, 14, 13, 12, 11}, {32768, 8736756, 8729060, -1073744844, 
    -1073745080}, {0, -1073744928, 134518436, -1073745064, 134513340}, {
    7298965, 134518436, -1073745016, 134513785, 134513194}, {8740000, 8740000, 
    8736756, 134513760, 134513408}}
(gdb) p &a    
$2 = (int (*)[5][5]) 0xbffff314  
(gdb) p &a+1  
$3 = (int (*)[5][5]) 0xbffff378   
(gdb) p a+1
$4 = (int (*)[5]) 0xbffff328    
(gdb) p *(a+1)
$5 = {32768, 8736756, 8729060, -1073744844, -1073745080}
(gdb) p *(a+1)+1
$6 = (int *) 0xbffff32c
(gdb) p *(*(a+1)+1)
$7 = 8736756
(gdb) p *a
$8 = {15, 14, 13, 12, 11}
(gdb) p **a
$9 = 15
(gdb) p **(a+1)
$10 = 32768
(gdb) p a[1]
$11 = {32768, 8736756, 8729060, -1073744844, -1073745080}
(gdb) p *a[1]
$12 = 32768
(gdb) p a[1]+1
$13 = (int *) 0xbffff32c
(gdb) p *(a[1]+1)
$14 = 8736756

根據$2 = (int (*)[5][5]) 0xbffff314中的[5][5]可知&a的大小是5*5的空間,剛好是一個數組的大小,說明&a表示整個數組的起始地址。(gdb) p &a+1  $3 = (int (*)[5][5]) 0xbffff378  中的[5][5]可知&a+1也是一個數組的起始地址,這也說明了&a是整個數組的初始地址。

(gdb) p a+1,$4 = (int (*)[5]) 0xbffff328中的[5]說明a+1是元素a[1](數組5個元素)的起始地址,而不是某一個數值(二維元素)的起始地址。

(gdb) p *a,$8 = {15, 14, 13, 12, 11},(gdb) p **a,$9 = 15,$8,$9說明a表示的是元素a[0](一個小數組)的起始地址,而不是某一個值的起始地址。*a是一個值(二維元素)的起始地址。

(gdb) p a[1]+1 $13 = (int *) 0xbffff32c 說明a[1]+1是一個值的地址,而不是一個數組的起始地址,因此a[i]+j是一個值(二維元素)的地址。

(gdb) p *(a+1)+1  $6 = (int *) 0xbffff32c   (gdb) p *(*(a+1)+1) $7 = 8736756,根據調試結果可知*(a+1)+1是一個值的地址。因此*(a+i)+j是一個值(二維元素)的地址。同時可知*(*(a+i)+j)是一個值(二維元素)。a[i][j]也是一個值。
 

 
 
綜合上面的分析可知數組名A在作為右值時是數組首個元素(可能是一個值也可能是一個數組)的起始地址,而&A表示整個數組的起始地址。二維數組具體問題建議多去調試,根據調試分析其中的意義。多調試,多觀察,多理解。
 
關閉窗口

相關文章

主站蜘蛛池模板: 日本不卡一区二区三区在线观看 | 一区二区三区中文字幕 | 日韩欧美在线观看视频 | 国产精品中文字幕一区二区三区 | 成人免费视频网站在线看 | 国产三级精品三级在线观看四季网 | 亚洲成人高清 | 天堂一区二区三区 | 国产xxxx搡xxxxx搡麻豆 | 欧美一级淫片免费视频黄 | 不卡在线视频 | 国产精品亚洲一区二区三区在线观看 | 欧美在线日韩 | 一区二区日韩 | 国产一区二区三区在线 | 日韩欧美在线一区 | 日韩视频精品在线 | 99精品久久久久 | 久久精品成人 | 亚洲视频免费观看 | 97在线播放| 国产精品一二区 | av网站观看 | 亚洲欧美精品 | 欧美激情国产日韩精品一区18 | 成人性生交大片免费看r链接 | 日韩成人免费 | 欧美在线观看一区 | 国产成人精品福利 | 日韩中文字幕在线视频 | 91最新视频| 国产一区二区三区四区五区加勒比 | 人妖av| 久久久青草婷婷精品综合日韩 | 亚洲第一网站 | 91社区在线观看播放 | 精品91久久| 日韩欧美一区二区三区 | 国产欧美日韩一区二区三区在线观看 | 午夜精品视频 | 激情小说综合网 |