一、*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 ...