【C语言笔记】关于数组的一个陷阱!
問題
兩個數組元素的地址相減得到什么?
我們先看一段代碼:
#include <stdio.h> int main(void) {int a[]={0,1,2,3,4,5};printf("&a[0] = %d, &a[2] = %d\n", &a[0], &a[2]);return 0; }這段代碼以十進制的形式打印出第0號元素的地址和第2號元素的地址,輸出結果為:
&a[0] = 2686760, &a[2] = 2686768所以,?&a[2]-&a[0]的結果是8?但是,事實不是這樣的!!讓我們把其結果打印出來:
竟然是?2!我們把?&a[5]-&a[2]的結果輸出來看看有什么規律:
陷阱
事實證明,兩個數組元素的地址相減,其值并不是等于兩個地址數值上的差,而是等于這兩個地址之間內存單元的個數。本例中數組的類型是 int 類型,并且在 32bit 編譯環境下編譯,因此這里的內存單元的大小是4字節。所以本例中?&a[2]-&a[0]的值為:
(2686768 - 2686760)/4當然,若是低號元素地址減去高號元素地址,得到的結果是負數:
網上看到了一篇博客也是印證了這一點:
https://blog.csdn.net/harvic880925/article/details/8953854這是個很容易出錯的問題,需要特別注意!
學以致用
我們的C語言每日一練(004)中的題目是
尋找數組元素第一次出現的位置
之前已經提供了兩種方法,函數的返回值都是要尋找的元素的下標。這里可以稍微修改一下得到第三種方法,我們的第三種方法返回的是尋找的元素的指針:
// 函數返回找到元素的指針 int *serch(int *arr,// 已知數表的首元指針int n, // 數表中元素個數int key) // 要尋找的值 {int *p;for (p = arr; p < arr+n; p++){if (*p == key){return p; // 返回找到元素的指針}}return NULL; // 未查找到key }完整的驗證代碼為
/******************************************************************************************************* ** 題 目: 同一個數組中兩個元素的地址相減 ********************************************************************************************************/ #include <stdio.h> // 函數返回找到元素的指針 int *serch(int *arr,// 已知數表的首元指針int n, // 數表中元素個數int key) // 要尋找的值 {int *p;for (p = arr; p < arr+n; p++){if (*p == key){return p; // 返回找到元素的指針}}return NULL; // 未查找到key } // 定義一個全局數組 int a[]={5,2,0,13,14,999,666, 55, 66, 88, 1, 5, 9}; // 主函數 int main(void) {int i, key;int *p_a;printf("The elements of array a is:\n");for (i = 0; i < sizeof(a)/sizeof(a[0]); i++){printf(" %d",a[i]);}puts("\nPlease input the key number you want to search:");scanf("%d", &key);p_a = serch(a, sizeof(a)/sizeof(a[0]), key);printf("\nThe index of the key number %d in the array is: %d.", key, p_a-a);return 0; }運行結果:
可見,得到的結果與我們C語言每日一練(004)中的驗證結果一樣。
-END-
猜你喜歡
機器人是如何群居生活的?<<戳這里
論嵌入式與單片機,相愛相殺。<<戳這里
做技術的,聊聊研發。<<戳這里
?最 后??
?若覺得文章不錯,轉發分享,也是我們繼續更新的動力。
5T資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,PCB、FPGA、DSP、labview、單片機、等等!
在公眾號內回復「更多資源」,即可免費獲取,期待你的關注~
長按識別圖中二維碼關注?
總結
以上是生活随笔為你收集整理的【C语言笔记】关于数组的一个陷阱!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Histogram、Summary 笔记
- 下一篇: 北航和哈佛研发软体机器人,抓住各类物体!