int p;
乙個普通的整型型別
int *p;
先看p
和*
結合,說明p
是乙個指標,然後再與int
結合,說明指標指向的內容是整型型別。所以p
是乙個指向整型型別的指標。
int p[3];
先看p
與
結合,說明p
是乙個陣列,然後再與int
結合,說明陣列中元素的型別是整型。所以p
是乙個由整型型別元素組成的陣列。
int *p[3];
先看p
與
結合,說明p
是乙個陣列,然後與*
結合,說明陣列中的元素的型別是指標,最後再與int
結合,說明指標指向的內容的型別的整型。所以p
是乙個由指向整型資料的指標組成的陣列。
int (*p)[3];
先看p
與*
結合,說明p
是乙個指標,然後再與
結合,說明指標指向的內容是乙個陣列,最後和int
結合,說明陣列的元素是整型型別。所以p
是乙個指向由整型資料組成的陣列的指標。
int **p;
先看p
與*
結合,說明p
是乙個指標,然後又和*
結合,說明指標指向的元素還是乙個指標,最後再與int
結合,說明指向的型別的是整型。所以p
是乙個指向返回整型型別的指標的指標。平時最多也就會用到二級指標,更多級的指標極少使用。
int p(int);
先看p
與()
結合,說明p
是乙個函式而且有乙個整型變數作為引數,最後與int
結合。所以p
是乙個返回值為整型且有乙個整型變數引數的函式。
int (*p)(int);
先看p
與*
結合,說明p
是乙個指標,然後和()
結合,說明指標指向乙個有乙個整型變數作為引數的函式,最後與int
結合,說明函式的返回型別是整型。所以p
是乙個指向有乙個整型變數作為引數且返回型別是整型的函式的指標。
int *(*p(int))[3];
先看p
與()
結合,說明p
是乙個有乙個整型變數作為引數的函式,然後再和*
結合,說明函式的返回型別是乙個指標,然後再和
結合,說明指標指向乙個陣列,然後再和*
結合,說明陣列的元素是指標,最後再和int
結合,說明指標指向的型別是整型。所以p
是乙個有乙個整型型別引數且返回型別是乙個指向由整型型別指標組成的陣列的指標的函式。
總結:變數的型別由第乙個相結合的符號決定(由內到外分析)
指標是乙個特殊的變數,裡面儲存的數值其實是記憶體中的乙個位址。
全面了解指標要從四個方面來看:
把指標宣告語句裡的指標名字去掉,剩下的部分就是這個指標的型別。
例子:
int *ptr; // int *
int **ptr; // int **
int (*ptr)[3]; // int (*)[3]
把指標宣告語句中的指標名字和名字左邊的指標符號去掉,剩下的就是指標所指向的型別。
例子:
int *ptr; // int
int **ptr; // int *
int (*ptr)[3]; // int ()[3]
指標的算術運算中,指標所指向的型別有很大的作用。
指標的型別和指標所指向的型別完全是兩個不同的概念。
在 32位程式裡所有型別的指標的值都是乙個32位的整型,因為32位程式裡的位址都是32位長。
指標所指向的記憶體區就是從指標的值所代表的記憶體位址開始,長度為sizeof(指標所指向的型別)
的一片記憶體區。簡單的說,就是指標其實是指向了一片記憶體空間,指標的值時該記憶體空間的首位址。
注意,指標所指向的記憶體區和指標所指向的型別是完全不同的概念,如果指標沒有初始化,而指標所指向的型別已經確定,那麼它所指向的記憶體區是不存在的或者是沒有意義的。
指標本身占用的記憶體等於sizeof(指標的型別)
。
指標可以加上或者減去乙個整數。
例1:
char a[20];
int *ptr=(int *)a;
ptr++;
指標ptr
加1相當於ptr
的值加上sizeof(int)
。所以ptr
指向的位址由原來的變數a
的位址加上4個位元組。由於char
長度是乙個位元組,所以ptr
指向的是a
陣列中從第四號(0開始)元素開始的四個位元組。
例2:
int array[20]=;
int *ptr=array;
for(int i=0;i<20;i++)
這個例子中,ptr
指向的型別和陣列元素的型別相同,迴圈中先是將ptr
指向的元素加一然後將指標移向下乙個元素,最後的效果就是依次將每個元素加一。
例3:
char a="helloworld";
char *p=a;
char **ptr=&p;
ptr++;
printf("%c",**ptr);
ptr
的型別是乙個char **
,指向的型別是char *
,指標的值是p
的位址,執行ptr++
的時候,指標的值會加上乙個sizeof(char *)
也就是4,而*(&p+4)
是乙個無意義的值。
總結:乙個指標old
加(減)乙個整數 n 後,結果是乙個新的指標new
,指標的型別沒有變化,指標指向的物件的型別也沒有變化,new
比old
的值增加(減少)了 n 乘 sizeof(指標指向的型別)個位元組。
注意:兩個指標不能進行加法,這是非法操作,因為得到的是乙個指向無意義的指標。兩個指標可以進行減法,但是型別必須相同,常常用於陣列。
小轉大不安全。
C 指標總結
指標定義和基本操作 指標是記憶體的乙個位址。定義格式,型別名 指標變數名 其中指標變數名指的是記憶體位址,加 是表示指向這一記憶體位址所儲存的內容,如果要取位址的話就要用 來處理,比如 指標變數名 或 指標變數名,如果指標暫時不用的時候,可以賦給乙個空指標 null。統配指標型別void void ...
C 指標 總結
對指標的一些總結 計算機記憶體中的每個位置都由乙個位址標識。通常,鄰近的記憶體位置合成一組,這樣就允許儲存更大範圍的值。指標就是他的值表示記憶體位址的變數。無論是程式設計師還是計算機都無法通過值的位模式來判斷它的型別。型別是通過值的使用方法隱式地確定的。編譯器能夠保證值的宣告和值的使用之間的關係是適...
C 指標總結
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!指標是一變數或函式的記憶體位址,是乙個無符號整數,它是以系統定址範圍為取值範圍,32位,4位元組。存放位址的變數。在c 中,指標變數只有有了明確的指向才有意義。int ptr 指向int型別的指標變數 char ptr float ptr char...