指標的偏移和陣列與指標的結合使用

2021-10-06 10:57:22 字數 1802 閱讀 6548

一.指標的定義

型別名 *指標變數名;

型別決定指標的大小,可用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 那麼可以...