www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 公眾號精選 > strongerHuang
[導(dǎo)讀]關(guān)注、星標(biāo)公眾號,不錯過精彩內(nèi)容 轉(zhuǎn)自:嵌入式Hacker 正文目錄: 1.?數(shù)組名是該數(shù)組首元素的地址 2.?用指針操作數(shù)組 3.?數(shù)組和指針的關(guān)系密切 4. 編寫處理一維數(shù)組的函數(shù):傳遞數(shù)組起始地址+數(shù)組長度 5. 編寫處理一維數(shù)組的函數(shù):傳遞數(shù)組起始地址+結(jié)束地

關(guān)注、星標(biāo)公眾,不錯過精彩內(nèi)容

轉(zhuǎn)自:嵌入式Hacker

正文目錄:

1. 數(shù)組名是該數(shù)組首元素的地址
2. 用指針操作數(shù)組
3. 數(shù)組和指針的關(guān)系密切
4. 編寫處理一維數(shù)組的函數(shù):傳遞數(shù)組起始地址+數(shù)組長度
5. 編寫處理一維數(shù)組的函數(shù):傳遞數(shù)組起始地址+結(jié)束地址

學(xué)習(xí)環(huán)境:

  • Ubuntu 16.04
  • gcc version 5.4.0

1. 數(shù)組名是該數(shù)組首元素的地址

演示 demo:

#define MONTHS 12
int main(void)
{
    int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
    
    if (days == &days[0])
        printf("TRUE\n");
    
    return 0;
}

運(yùn)行效果:

$ gcc array_name.c -o array_name

$ ./array_name 
TRUE

相關(guān)要點(diǎn):

  • 數(shù)組名和該數(shù)組首元素的地址都是常量,在程序的運(yùn)行過程中,不會改變。

2. 用指針操作數(shù)組

演示 demo:

#define SIZE 4
int main(void)
{
    short dates [SIZE];
    short * pti;
    short index;
    double bills[SIZE];
    double * ptf;
    
    pti = dates;    // assign address of array to pointer
    ptf = bills;
    printf("%23s %15s\n""short""double");
    for (index = 0; index < SIZE; index ++)
        printf("pointers + %d: %10p %10p\n",  index, pti + index, ptf + index);
    
    return 0;
}

運(yùn)行效果:

$ gcc point_array.c -o point_array

$ ./point_array
                  short          double
pointers + 00x7ffc890b17c0 0x7ffc890b17d0
pointers + 10x7ffc890b17c2 0x7ffc890b17d8
pointers + 20x7ffc890b17c4 0x7ffc890b17e0
pointers + 30x7ffc890b17c6 0x7ffc890b17e8
  • 指針的值是它所指向?qū)ο蟮牡刂罚羔樓懊媸褂?* 運(yùn)算符可以得到該指針?biāo)赶驅(qū)ο蟮闹怠?/p>

  • %p 會以十六進(jìn)制顯示指針的值。

  • 必須聲明指針?biāo)赶驅(qū)ο箢愋?,原因之一:?jì)算機(jī)既要知道儲存對象的地址,又要知道儲存對象需要多少字節(jié)。

  • 指針加 1 指的是增加一個數(shù)據(jù)存儲單元。對數(shù)組而言,這意味著加 1 后的地址是下一個元素的地址,而不是下一個字節(jié)的地址。


3. 數(shù)組和指針的關(guān)系密切

以下關(guān)系表明了數(shù)組和指針的關(guān)系十分密切:

days + 2 == &days[2]   // TRUE,相同的地址
*(days + 2) == days[2// TRUE,相同的值

演示 demo:

int main(void)
{
    int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31};
    int index;
    
    for (index = 0; index < MONTHS; index++)
        printf("Month %2d has %d days.\n", index +1, *(days + index));
    
    return 0;
}

運(yùn)行效果:

$ gcc point_array2.c -o point_array2

$ ./point_array2 
Month  1 has 31 days.
Month  2 has 28 days.
...
Month 12 has 31 days.
  • C 語言在描述數(shù)組表示法時借助了指針:ar[n]的意思是*(ar + n)。

  • 可在編寫程序時適時使用 數(shù)組表示法或指針表示法,這是兩種功能等效的方法。大多數(shù)情況下可以用指針表示數(shù)組,反過來,也可以用數(shù)組表示指針。

  • 編譯器編譯這兩種寫法生成的代碼相同。


4. 編寫處理一維數(shù)組的函數(shù):傳遞數(shù)組起始地址+數(shù)組長度

假設(shè)要編寫一個處理數(shù)組的函數(shù),該函數(shù)返回?cái)?shù)組中所有元素之和,待處理的是名為 data 的 int 類型數(shù)組,應(yīng)該如何調(diào)用該函數(shù)?

演示 demo:

int sum(int ar[], int n);
int main(void)
{
    int data[SIZE] = {20,10,5,39,4,16,19,26,31,20};
    long answer;
    
    answer = sum(data, SIZE);
    printf("The total number of data is %ld.\n", answer);
    printf("The size of data is %zd bytes.\n",
           sizeof data);
    
    return 0;
}

int sum(int ar[], int n)
{
    int i;
    int total = 0;
    
    for( i = 0; i < n; i++)
        total += ar[i];
    printf("The size of ar is %zd bytes.\n"sizeof ar);
    
    return total;
}

運(yùn)行效果:

$ gcc func_array.c -o func_array
func_array.c: In function ‘sum’:
func_array.c:26:53: warning: ‘sizeof’ on array function parameter ‘a(chǎn)r’ will return size of ‘int *’ [-Wsizeof-array-argument]
     printf("The size of ar is %zd bytes.\n"sizeof ar);
                                                     ^
func_array.c:19:13: note: declared here
 int sum(int ar[], int n)

$ ./func_array
The size of ar is 8 bytes.
The total number of data is 190.
The size of data is 40 bytes.
  • 數(shù)組名是該數(shù)組首元素的地址,所以實(shí)參 data 是一個儲存int 類型值的地址,那么函數(shù) sum 的形參數(shù)就應(yīng)該是一個指針。

  • 在函數(shù)聲明或函數(shù)定義中,int ar[] 等效于 int *ar,本質(zhì)上都應(yīng)該看作是指針。

  • 只有在函數(shù)聲明或函數(shù)定義中,才可以用int ar[]代替int *ar。

  • 函數(shù)聲明可以省略參數(shù)名,所以下面 4 種原型都是等價的:

  • 注意編譯器的警告信息:warning: ‘sizeof’ on array function parameter ‘a(chǎn)r’ will return size of ‘int *’,這是在提示程序員你打印的是指針的 size,而不是整個數(shù)組的 size。

int sum(int *ar, int n);
int sum(int *, int);
int sum(int ar[], int n);
int sum(int [], int);
  • 一般會把數(shù)組的參數(shù)作為其中一個參數(shù)傳遞給處理數(shù)組的函數(shù)。

5. 編寫處理一維數(shù)組的函數(shù):傳遞數(shù)組起始地址+結(jié)束地址

演示 demo:

int sump(int * start, int * end);
int main(void)
{
    int data[SIZE] = {20,10,5,39,4,16,19,26,31,20};
    long answer;
    
    answer = sump(data, data + SIZE);
    printf("The total number of data is %ld.\n", answer);
    
    return 0;
}

int sump(int * start, int * end)
{
    int total = 0;
    
    while (start < end)
    {
        total += *start;
        start++;next element
    }
    
    return total;
}

運(yùn)行效果:

$ gcc func_array2.c -o func_array2

$ ./func_array2
The total number of marbles is 190.

相關(guān)要點(diǎn):

  • 注意 answer = sump(data, data + SIZE) 和 while (start < end),這是一種推薦用法,簡潔且清晰。因?yàn)橄聵?biāo)從 0 開始,所以 data + SIZE 指向數(shù)組末尾的下一個位置。

  • data + SIZE 是推薦的,但是 data[SIZE] 則是錯誤的。

  • 處理數(shù)組的函數(shù)實(shí)際上用指針作為參數(shù),但是在編寫這樣的函數(shù)時,可以選擇是使用數(shù)組表示法還是指針表示法。數(shù)組表示法讓函數(shù)是處理數(shù)組的這一意圖更加明顯,而對于喜歡指針的程序員,使用指針表示法,則覺得使用指針更自然。

推薦閱讀:

模擬電路中常用電阻參數(shù)詳解

USB 2.0 網(wǎng)絡(luò)、傳輸、通訊和協(xié)議

面試時,數(shù)據(jù)結(jié)構(gòu)與算法太重要了


關(guān)注 微信公眾號『strongerHuang』,后臺回復(fù)“1024”查看更多內(nèi)容,回復(fù)“加群”按規(guī)則加入技術(shù)交流群。


長按前往圖中包含的公眾號關(guān)注

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉