【C語言筆記】關(guān)于數(shù)組的一個陷阱!
問題
兩個數(shù)組元素的地址相減得到什么?
我們先看一段代碼:
#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;
}
這段代碼以十進(jìn)制的形式打印出第0號元素的地址和第2號元素的地址,輸出結(jié)果為:
&a[0] = 2686760, &a[2] = 2686768
所以, &a[2]-&a[0]
的結(jié)果是8?但是,事實不是這樣的?。∽屛覀儼哑浣Y(jié)果打印出來:
竟然是 2
!我們把 &a[5]-&a[2]
的結(jié)果輸出來看看有什么規(guī)律:
陷阱
事實證明,兩個數(shù)組元素的地址相減,其值并不是等于兩個地址數(shù)值上的差,而是等于這兩個地址之間內(nèi)存單元的個數(shù)。本例中數(shù)組的類型是 int 類型,并且在 32bit 編譯環(huán)境下編譯,因此這里的內(nèi)存單元的大小是4字節(jié)。所以本例中 &a[2]-&a[0]
的值為:
(2686768 - 2686760)/4
當(dāng)然,若是低號元素地址減去高號元素地址,得到的結(jié)果是負(fù)數(shù):
網(wǎng)上看到了一篇博客也是印證了這一點:
https://blog.csdn.net/harvic880925/article/details/8953854
這是個很容易出錯的問題,需要特別注意!
學(xué)以致用
我們的C語言每日一練(004)中的題目是
尋找數(shù)組元素第一次出現(xiàn)的位置
之前已經(jīng)提供了兩種方法,函數(shù)的返回值都是要尋找的元素的下標(biāo)。這里可以稍微修改一下得到第三種方法,我們的第三種方法返回的是尋找的元素的指針:
// 函數(shù)返回找到元素的指針
int *serch(int *arr,// 已知數(shù)表的首元指針
int n, // 數(shù)表中元素個數(shù)
int key) // 要尋找的值
{
int *p;
for (p = arr; p < arr+n; p++)
{
if (*p == key)
{
return p; // 返回找到元素的指針
}
}
return NULL; // 未查找到key
}
完整的驗證代碼為
/*******************************************************************************************************
** 題 目: 同一個數(shù)組中兩個元素的地址相減
********************************************************************************************************/
#include <stdio.h>
// 函數(shù)返回找到元素的指針
int *serch(int *arr,// 已知數(shù)表的首元指針
int n, // 數(shù)表中元素個數(shù)
int key) // 要尋找的值
{
int *p;
for (p = arr; p < arr+n; p++)
{
if (*p == key)
{
return p; // 返回找到元素的指針
}
}
return NULL; // 未查找到key
}
// 定義一個全局?jǐn)?shù)組
int a[]={5,2,0,13,14,999,666, 55, 66, 88, 1, 5, 9};
// 主函數(shù)
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;
}
運行結(jié)果:
可見,得到的結(jié)果與我們C語言每日一練(004)中的驗證結(jié)果一樣。
猜你喜歡
最 后
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!