一.指標的定義
型別名 *指標變數名;
型別決定指標的大小,可用sizeof運算子去計算大小。
二.指標的賦值
1.使用位址進行賦值,資料型別與指標型別需一致
int inum = 0x64;
int *ptr;
ptr = &inum ;
2.利用指標之間相互賦值,指標型別必須一致
int *ptr1,*ptr2;
*ptr1 = *ptr2;
三.指標的本質
指標的本質就是指向某個記憶體位址的標記,指標交換其實就是交換相互指向的記憶體位址。
四.指標的偏移
1.指標的單個偏移
int array[10]=;
int *ptr;
ptr=&array[0];//指標指向陣列的第一資料
printf("%d\n",*ptr); //輸出值為0,指向array[0]
printf("%d\n",*(++ptr);//輸出值為1,指向array[1],使用++ptr為了ptr加1
以上面**為例,指標的偏移量為int型的大小,可以讓指標的加減去讀取陣列的資料。
2.指標的多個偏移
(1)陣列長度的偏移
int temp[5];
char *p = &temp;
char *q = temp;
在這裡,p和q的值是一樣的,含義卻不一樣,前者是指向陣列的指標,而後者是指向該陣列中下標為0的元素的指標。因此p+1指向了temp的末尾,而q+1指向了temp的第2個元素。
#includeint main(void)
; int *p = (int*)(&a+1);
printf("%d,%d",*(a+1),*(p-1));
return 0;
}
上面**的輸出值為2,5;
int p = (int)(&a+1);這裡(&a+1)偏移整個陣列的長度。
(2)陣列內的多個指標長度偏移,利用陣列下標偏移
const uint8_t test_array[100]=;
const uint8_t * test_prt;
test_prt= (const uint8_t *)test_array;//把陣列賦值給指標,指標指向第乙個資料
如果我想要取出第20-29資料出來用,最容易肯定通過陣列下標去取值;
當取出的資料越多,通過下標取數就不那麼方便;
uint8_t cnt = 20;
uint8_t temp;
test_prt= &test_array[cnt ];//對指標重指向,實現多個長度跳轉
temp=*test_prt++;//通過指標偏移去讀取資料,限制次數就可以讀取多少個資料
五.陣列與指標的總結
1.陣列下標運算實際上都是通過指標進行的。
2.陣列名代表著指向該陣列中下標為0的元素的指標,但有例外:sizeof(陣列名)返回整個陣列的大小,而非指標大小;&陣列名返回乙個指向陣列的指標,而不是指向該陣列中下標為0的元素的指標的指標。
3.陣列名作為引數時,陣列名會被轉換成指向該陣列下標為0的元素的指標。
4.指標操作可能比下標操作效率高,但可維護性卻不一定有下標操作好。
5.陣列和指標不相等。
指標與函式和陣列結合
先來看看下面面試題 1.float def 10 2.double gh 10 3.double f 10 4.int b 10 5 long fun int 6.int f int,int int 第一題。先看變數 的結合方式以第一題為例 結合方式是 先看變數 分析變數與誰結合 之後再跳出括號從右...
指標陣列和陣列指標 和 指標和陣列的定義與宣告
舉個栗子來區分以下指標陣列和陣列指標 int arr1 10 是指標陣列,arr1和 的結合性更高一些,所以arr1先與 結合成為陣列,陣列有10個元素,每個元素的型別都為int 型,所以 int arr1 10 是存放整型指標的陣列。int p 10 是陣列指標,p先與 結合,說明p是乙個指標變數...
C語言小結 指標和陣列的結合
我們知道,訪問乙個變數的內容的實質就是訪問記憶體,訪問乙個變數可以通過變數名訪問,也可以通過指標來訪問。如下的兩種操作printf結果是一樣的 include int main void 結合上一章提到的,int a 10 中a就表示陣列的首位址,那麼我們定義int p,就可以賦值為p a 那麼可以...