指標與陣列

2021-08-14 22:56:03 字數 2017 閱讀 8115

指標以更接近機器的方式表示位址,所以會更有效率

首先是指標的概念:

int* p;    //定義乙個指向int的指標

int n = 3;

p = &n; //賦值

printf("p=%x\n&p=%x\n*p=%d\n&n=%x\nn=%d",p,&p,*p,&n,n );

p=eff7ac   //指標的值是所指向物件的位址

&p=eff7b8 //指標本身的位址

*p=3

//指向物件的值

&n=eff7ac //物件的位址

n=3//物件的值

陣列的指標表示法:更接近機器表示

int

s[4] = ;

printf("s[2]=%d\n*(s+2)=%d\n&s[2]=%x\ns+2=%x",

s[2], *(

s + 2), &s[2], s + 2);

s[2]=1

//陣列表示法

*(s+2)=1

//注意*(s+2)和*s+2的區別,且只有s是指標變數才有s++這樣的表示式

&s[2]=d5fcd8

s+2=d5fcd8

陣列可以用指標表示,但不代表陣列名就是指標,指標可以代表陣列名,例如:

int

s[4] = ;

int* p = s;

printf("size of s:%d\n",sizeof(s));

printf("size of p:%d", sizeof(p));

p並不是陣列本身,而是指向s陣列的指標

size of s:16

size of p:4

注意:

int

s[4] = ;

int* p = s;

printf("%d", *p++);

12

//*和++優先順序相同,但是結合律從右往左,所以先求p++,但是這個操作要到printf("%d",

*p++);整條語句結束才會生效,所以*p的值依舊是12,

再看乙個:

int

s[4] = ;

int* p = s;

printf("%d

%d", *p++, *++p);

51

printf("%d

%d", *++p,*p++);

112

我用的是vs2017,不同系統可能會有所不同吧

從這兩個語句大概猜出了printf函式的工作原理:應該是乙個棧,從右到左入棧,期間計算p,

再出棧輸出,這樣就能解釋的通了,這種語句以後還是少寫

指標與多維陣列

int

s[4][2] = ,,, };

printf("%p

%p%p

%p", s,s[0],*s,&s[0][0]);

004ff7f8 004ff7f8 004ff7f8 004ff7f8

之前說過s是陣列首元素的位址,s的首元素是乙個內含2個int的子陣列,s[0]是乙個占用乙個

int大小物件的位址,由於陣列都開始與用乙個位址,即s[0]和s的值相同

*s就就表示陣列首元素的值(s[0]),s[0]本身就是int型別值的位址,該值位址就是&s[0][0]

再看乙個例子:

int s[4][2] = ,,, };

printf("%d", *(*(s + 2) + 1));

8
其實&和*就像是**服和穿衣服似的關係

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

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