2.2 數組和指標可以相同麼 1 一個很多人都會做錯的面試題 仔細查看以下代碼,print_arr_addr和print_g_arr_addr的列印輸出地址相同麼。為什麼
#include <stdio.h>int a[10] = {1, 3, 4};void print_arr_addr(int *p){ printf("&p = 0x%08x.\n", (unsigned)&p); printf("&p[0] = 0x%08x.\n", (unsigned)&p[0]);}void print_g_arr_addr(){ printf("&a = 0x%08x.\n", (unsigned)&a); printf("&a[0] = 0x%08x.\n", (unsigned)&a[0]);}int main(){ print_arr_addr(a); print_g_arr_addr(); return 0;} 在這裡我先不說答案,相信大家在看完這篇文章後會,自然就清楚為什麼了。 2 數組與指標的差別 2.1 數組和指標是如何訪問的 2.1.1 數組和指標的定義和聲明
在這裡有必要列出聲明和定義的區別: 定義: 只能出現在一個地方,它會為對象分配記憶體 聲明: 可以出現在多個地方,描述對象的類型,用於指代其他地方定義的對象
//x是一個指向int型的指標的聲明extern int *x;//y是一個int型數組的聲明extern int y[];//定義指標xint *x;//定義數組yint y[10];
數組下標的引用: 數組可以直接對資料進行訪問,如果我們定義一個數組int A[ 10 ], A的地址和A[ 0 ]的地址是相同的。
指標下標的引用: 指標對資料的訪問實際上是間接訪問,int * p, p的地址和p[ 0 ]的地址絕對是不同的
總的來說,指標在從記憶體中取資料比數組要多一步,這多出的一步就是取址。數組的地址就是數組第一個元素的地址,因此數組不需要這一個步驟。 2.2 數組和指標可以相同麼
數組和指標當然在有些情況下面是等價的:
在作為函數的形參時,數組聲明與指標聲明是等價的。你可以隨自己喜歡,選擇數組方式或者是指標方式。 在運算式中使用時,下標訪問對於數組和指標也是等價的,c = a[i], 無論a聲明為數組還是指標都沒有區別。 3 小結 對於定義和聲明,數組和指標是不相同的,定義為數組,則聲明也應該是數組,如果混合使用會出現意料不到的錯誤。 當用下標操作符對數組和指標進行運算的時候,數組和指標是等價的。a[ i ]會被編譯器翻譯成*(a+i)的形式。 當數組聲明被用作函數形參的時候,該數組實際會被當作指標來使用。
Author: Elvin, Huang<huangkangying@qq.com>
Date: 2014-12-29 21:55:58
HTML generated by org-mode 6.31a in emacs 23