換個角度掌握C語言一維數(shù)組和指針
掃描二維碼
隨時隨地手機(jī)看文章
正文目錄:
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 + 0: 0x7ffc890b17c0 0x7ffc890b17d0
pointers + 1: 0x7ffc890b17c2 0x7ffc890b17d8
pointers + 2: 0x7ffc890b17c4 0x7ffc890b17e0
pointers + 3: 0x7ffc890b17c6 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ù)組的這一意圖更加明顯,而對于喜歡指針的程序員,使用指針表示法,則覺得使用指針更自然。
USB 2.0 網(wǎng)絡(luò)、傳輸、通訊和協(xié)議
面試時,數(shù)據(jù)結(jié)構(gòu)與算法太重要了
長按前往圖中包含的公眾號關(guān)注
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!