一、指標是個什麼鬼
指標就是變數的位址,指標變數就是有乙個變數,它的值是指標。也就是說這個變數的值是乙個位址。
醬無論是一級指標還是二級指標,這個變數的值都只是乙個位址而已。關鍵在於我們怎麼去使用這個值。
通過一段**來說明指標
指標的賦值
通過彙編可以
更清晰的分析指標的本質,p的值實際上就是
-12(%rbp),也就是指標。
一級指標:
二級指標:
通過上面的**,我們已經大致知道了指標到底是個什麼鬼。
二、指標的相關宣告
例:int x; //x是變數,int是型別
那麼我們宣告乙個指標
int *p; //*p 說明p是乙個指標變數, 指向的是乙個
intint **p; //===>(int *)(*p) *p說明是乙個指標,指向的是乙個(int*)
int (*p)[5]; //*p說明p是乙個指標,指向的型別是int [5]
void (*p)(int,int); //*p是乙個指標,指向的型別是void(int,int)
int *p[5]; //==>(int *)(p[5]) p是乙個5元素陣列,陣列元素型別是int *
三、陣列作為函式引數
void func(int a[10]);
=>void func(int *a);
int (a[10]) 首先a是乙個
10元素陣列,然後陣列元素是
intvoid func(int a[10][8]);
=>int func(int (*a)[8]);
int (a[10])[8] 首先a是乙個
10個元素的陣列,然後陣列元素是int [8](也就是8個
int的陣列,總結就是:a是乙個
10個元素的陣列,陣列元素是乙個有8個
int的陣列)
四、指標的運算
最常見的是指標的自增
如:void mstrcpy(char *dest, char *src)
關於指標自增
如char *p;
上面的表示式實際上可以解釋為(char) (*p)
p++,關鍵是看指標的指向的型別,對於p指向的是乙個char,那麼p++便是前進
1個位元組。
如 char **p;
==>(char*) (*p)
p++,可以看出來p指向的型別是
char*,那麼p++,便是前進
4個位元組。
其實只要理解,運算子優先順序,上面的一些例子就很容易明白。
乙個例子:
#include #include #include char *a0 = ;
char *a1 = ;
char *a2 = ;
char *a3 = ;
char *a4 = ;
char *a5 = ;
char *a6 = ;
char *a7 = ;
char *a8 = ;
char *a9 = ;
char *sp = ;
void copy(char **p1, char **p2, char ***p)}
void print(char **p, int size)}
int main(void)
free(p);
return 0;
}
指標,指標,指標。。。
1 指標常量與常量指標 int a 10 int const p1 a const int p2 a p1是不可改變位址的常量,即指標常量,但可以對它所指向的內容進行修改。p2是指向常量的指標,即常量指標,它所指向的位址內容是不可修改的,但其本身確實可以修改的。2 指標運算 includeint m...
指標,指標,指標。。。
1 指標常量與常量指標 int a 10 int const p1 a const int p2 a p1是不可改變位址的常量,即指標常量,但能夠對它所指向的內容進行改動。p2是指向常量的指標,即常量指標,它所指向的位址內容是不可改動的,但其本身確實能夠改動的。2 指標運算 includeint m...
指標,指標,又見指標
在xcode中寫了一段下面的 nsstring s1 hi,i am sean nsstring s2 hi,i am sean nsstring s3 nsstring stringwithformat hi,i am sean s3 s1 if s1 s2 在debug模式看了一下,發現s1和s...