陣列與指標

2021-07-27 00:14:23 字數 1850 閱讀 5050

int

array[5] = ;

a為陣列名,表示陣列的首位址,在計算陣列中元素的值就是通過這個首位址+資料型別*偏移值而得到的。a=&a[0],因此,a是常量,不能進行a++。

printf("%d\t",*(array+1));

int*parray=(int

*)(&array+1);

printf("%d\n",*(parray-1));

在array+1過程中,偏移後的位址為array+sizeof(array)*1;而parray=(int )(&array+1),偏移後的位址為array+sizeof(*&array)*1。

array與&array的值是一樣的,都是該陣列的首位址,但他們的含義是不一。

array表示該陣列的首位址,及首元素的位址;而&array指向整個陣列的記憶體塊,每次+1時,array偏移乙個型別大小,而&array偏移整個陣列的記憶體塊大小,。

int a=5;

int*p = &a;

指標變數儲存的是變數的位址,通過指標變數是對資料的間接訪問。

main.c

extern

char

str;

int main(void)

test.c

int *str="guidao\n";

extern char str欺騙了編譯器,將指標型別的str當成了陣列型別來進行解析,輸出的是乙個錯誤的字串,那這個錯誤的字串是怎麼得到的。由於欺騙了編譯器,將str當成了陣列,但是str是乙個指標,儲存了」guidao\n」這個字串在常量區的首位址,假如位址為0x01880000,使用printf(「%s\n」,str)時,由於編譯器將str當成了陣列,直接將位址0x01880000解析輸出出來,因此我們看到了錯誤的值,如果想正確輸出,則可以強制轉化,改為:

printf("%s\n",(char *)(*(unsigned

int *)str));

陣列是直接訪問,而指標是間接訪問。

int

array[5] = ;

array[3]讀取數值時,通過array + 3*sizeof(*array)來得到位址,從而得到值,而使用:int *parray = array +3;可以直接得到偏移量,使用指標速度會更快。

int

array[5] = ;

int *parray = array +3;

array[3]=10;

*paray = 10;

彙編**

array[3] = 10

;00db1411 mov eax,4

00db1416 imul ecx,eax,3

00db1419 mov dword ptr array[ecx],0ah

*parray = 10

;00db1421 mov eax,dword ptr [parray]

00db1424 mov dword ptr [eax],0ah

使用指標彙編**更優化。

char str1[5]=;

char *str2="guidao\n";

str1可讀不可寫,*str1可讀可寫,相當於char *const str1;

str2可讀可寫,*str2可讀不可寫,相當於const char *str2

指標與陣列,指標陣列 陣列指標

int a 10 print n a p,a p a,a print n a 1 p,a 1 p a 1,a 1 a做乙個指標,步長為4,指向乙個元素,a做乙個指標,步長為40,指向乙個維陣列 int b 3 4 print n b p,b p,b p b,b,b print n b 1 p,b 1...

指標陣列與陣列指標

1.指標陣列 指標陣列中每乙個元素都是乙個指標,也既是存放字串的首位址。所以指標陣列適合處理若干個長度不等的字串。定義的一般形式為 型別說明符 指標陣列名 陣列長度 例如 int p 3 宣告乙個陣列,指標陣列p,由3個int型別指標變數元素組成 從運算子的優先順序分析,由於 的優先順序大於 所以p...

指標陣列與陣列指標

呵呵,實在是厭倦了繞口的解釋。指標陣列,故名思義,就是指標的陣列,陣列的元素是指標 陣列指標,同樣,就是直想陣列的指標。簡單舉例說明 int p 2 首先宣告了乙個陣列,陣列的元素是int型的指標。int p 2 宣告了乙個指標,指向了乙個有兩個int元素的陣列。其實這兩種寫法主要是因為運算子的優先...