陣列與指標

2021-09-27 08:06:00 字數 1866 閱讀 7278

其實按照我的理解,陣列和指標其實真沒多大關係,指標是有真實記憶體的,裡面的值為乙個位址值,而陣列是一塊記憶體空間的名字

int a;

int *p = &a;

這兩行**的意思是

在棧上分配乙個int 型別的空間,即4位元組,命名為a;分配乙個int *型別的空間,即8位元組,命名為p。在p的記憶體中寫入&a,即a的位址 。

而大多數人迷惑的原因在這

int a[10] = ;

int *p = a;

for (int i = 0; i < 10; i++)

輸出結果為:

0 0 0 0

1 1 1 1

2 2 2 2

3 3 3 3

4 4 4 4

5 5 5 5

6 6 6 6

7 7 7 7

8 8 8 8

9 9 9 9

以指標的形式訪問和以下標的形式訪問陣列

(1). 指標的形式:*(a + i)a代表陣列首元素的首位址,i代表偏移sizeof(int) * i.

(2). 以下標的形式:a[i]。 編譯器總是把下標的形式的操作解析成以指標的形式的操作。a[i]會被解析成:a作為首元素的首位址,然後加上sizeof(int) *i.

以指標的形式訪問和以下標的形式訪問指標

(1). 指標的形式:*(p + i)。先取出p儲存的位址值。然後加偏移量

(2). 以下標的形式:p[i]。編譯器總是把以下標形式的操作解析成以指標形式的操作。

以下標的形式訪問的本質上在本質上與以指標的形式訪問沒有區別,只是寫法上不同罷了

由上面的分析,指標和陣列根本就是兩個完全不一樣的東西.只是他們都可以"以指標形式"或「以下標形式」進行訪問。乙個是完全匿名訪問,乙個是具名+匿名的形式訪問。

char *p = "abcdefg";

char a = "123456";

第一句定義了乙個指標變數p,p本身在棧上佔8個byte,p裡面儲存的是一塊記憶體的首位址。這塊內存在靜態區,其空間大小為7byte,這塊記憶體也沒有名字,完全是匿名的訪問。

第二句定義了乙個陣列a,a擁有7個char型別的空間,其空間大小為7byte,陣列a本身在棧上面。對a元素的訪問必須先根據陣列名字a找到陣列首元素的首位址,然後根據偏移量找到相應的值。這是一種典型的「具名+匿名」訪問。

int *p1[10];     // 指標陣列

int (*p2)[10]; // 陣列指標

printf("%d\n", sizeof(p1));

printf("%d\n", sizeof(p2));

輸出結果

80

8

指標陣列:首先他是乙個陣列,陣列的元素都是指標。

陣列指標:首先他是乙個指標,它指向乙個陣列。

注意:所有的測試結果在x86 -64位機,linux 4.15.0-29deepin-generic gcc 環境下測試

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

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元素的陣列。其實這兩種寫法主要是因為運算子的優先...