指標的學習

2021-08-13 21:02:13 字數 2874 閱讀 4865

一、*p++和++*p用法

(1)y = *p++;

等於y = *p; p++;

例:int *p, a=3, y = 0;

p = &a;

printf(「%d,%x」, *p, p);

結果: 3,

bf884ff8

y = *p++;

printf(「%d,%x」, y, p);

結果: 3,

bf884ffc

printf(「%x」, *p);

結果: bf884ffc

(2)y = ++*p;

把*p的內容+1給y。

例:int *p, a= 3, y = 0;

p = &a;

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

結果:3, bfdf7568

y = ++*p;

printf("%x, %x\n", y, p);

結果:4, bfdf7568

printf("%x\n", *p);

結果:4

總結:經過*p++後,指標p移向下乙個位置,由於定義的是int型指標(int型佔4個位元組),所以移動的乙個單元是4個位元組,y的值始終是不變的,而*p在之前是3,之後輸出的是移動後的指標p的位址,因為p指向的地方沒有存有資料無法輸出具體數值,所以輸出的是位址。經過++*p後,只有*p(即p指向的位址儲存的數值)發生改變(+1),p的位址沒變。(指標變數+1,表示下乙個單元;位址+1,表示下乙個位元組)

二、指標和陣列

int a[5] =;

int *p;

p = a; ------

將陣列a的首位址給p,可換成p = &a[0],將第乙個元素的位址給p。

printf("a[2] = %d\n", a[2]);

結果:3

printf("a[2] = %d\n", p[2]);

結果:3

printf("a[2] = %d\n", *(p+2));

結果:3

printf("a[2] = %d\n", *(a+2));

結果:3

printf("a[2] = %d\n", *(&a[0]+2));

結果:3

三、指標和字串

char *ptr;

ptr = 「helloworld」;

等於:char *ptr = 「helloworld」; 例:

char *ptr;

ptr = 「helloworld」;

printf(「%s\n」, ptr);

結果:hello world

printf(「%c\n」,*ptr);

結果:h

printf(「%s\n」,*ptr);

出現段錯誤

總結:ptr = 「hello world」;

這一句是將字元指標ptr指向字串「hello world」的首位址『h』的位置。

四、sizeof和strlen

strlen

:針對字串的函式

sizeof

:求空間大小

例:int a[100] =;

printf(「%d\n」,sizeof(a));

結果:400

printf(「%d\n」,sizeof(a[0]));

結果:4

strlen

(a);

會出現問題

五、null和指標

在c語言stdio.h中null被定義成:#definenull ((void *)0)。

(void *)0

表示把數值0 強制轉換為void*型別,最外層的( )把巨集定義的內容括起來,我們自己進行巨集定義時也推薦這麼做,防止發生歧義。

但是判斷指標變數為不為0的時候,用if(ptr != null); 不允許用0來做比較;可以用char *ptr = null;

來初始化ptr,但是ptr還是不能使用;必須賦位址才行;

六、指標陣列和陣列指標

(1)指標陣列:

int *str[4] = ;

str[0]

存放的是「hello」的首位址

str[1]

存放的是「world」的首位址

str[2]

存放的是「yes」的首位址

str[3]

存放的是「what」的首位址

(2)陣列指標:

int a[3][4] = ;

int (*p)[4];-------

陣列指標

p = a ; p

放的是a的第0行首位址

p+1放的是第1行首位址

p+2放的是第2行首位址

p+3放的是第3行首位址

例1:(行指標變數)

int a[3][4] = ;

int(*p)[4];

int i, j;

p = a;

for(i=0; i<3;i++)

printf(「\n」); }

結果1234

5678

9101112

例2:(列指標變數)

int a[3][4] = ;

int *p;

for(p=a[0];p

結果:1 2 3456789101112

總結:指標陣列裡面的元素存放的是指標(位址),當給陣列賦值後,沒個指標分別指向對應字串的首位址。

陣列指標p指向的是第0行的首位址,加1後(p+1)指向第一行的首位址。

在二維陣列中,a[0]表示的是第0行0列的首位址,可直接向指標(p)賦值。

在陣列指標中,*(*p+i)------表示取出陣列第一行的各個值,

**(p+i)------

表示取出陣列每一行首個值

this指標的學習

this指標的一些特性 1它並不是物件本身的一部分,不影響物件的結果。且它的作用域是在類的內部。當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的位址作為乙個隱含引數傳遞給函式。例如 呼叫data.setmonth 9 等價於setmonth data,9 2 this 指標...

C 指標的學習

include head.c void main end switch end for end main void arrayref end for printf 1 output n for n 0 n 10 n end for printf n end arrayref void fingera...

指標陣列的學習

本章主要講解的內容是如何通過指針對二維陣列進行遍歷 首先,講解一下二維陣列,int a 3 3 二維陣列的數學概念就是乙個3 3階的矩陣形式,而實際中,二維陣列在記憶體中是一維線性排列的 我們先定義乙個指向a的指標p,int p 4 a。其中的優先順序高於 如果我們不帶上括號,就會變成 int p ...